From: Mike Bayer Date: Sat, 18 Feb 2006 16:32:33 +0000 (+0000) Subject: postgres needs to explicitly pre-execute PassiveDefaults on primary key columns,... X-Git-Tag: rel_0_1_1~31 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bc784f9556995ff0f4bf42144e55ff38441f065e;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git postgres needs to explicitly pre-execute PassiveDefaults on primary key columns, test added --- diff --git a/lib/sqlalchemy/databases/postgres.py b/lib/sqlalchemy/databases/postgres.py index d93a084ee5..a5b5b250dc 100644 --- a/lib/sqlalchemy/databases/postgres.py +++ b/lib/sqlalchemy/databases/postgres.py @@ -317,12 +317,19 @@ class PGSchemaDropper(ansisql.ANSISchemaDropper): class PGDefaultRunner(ansisql.ANSIDefaultRunner): def get_column_default(self, column): - if column.primary_key and isinstance(column.type, types.Integer) and (column.default is None or (isinstance(column.default, schema.Sequence) and column.default.optional)): - c = self.proxy("select nextval('%s_%s_seq')" % (column.table.name, column.name)) - return c.fetchone()[0] + if column.primary_key: + # passive defaults on primary keys have to be overridden + if isinstance(column.default, schema.PassiveDefault): + c = self.proxy("select %s" % column.default.arg) + return c.fetchone()[0] + elif isinstance(column.type, types.Integer) and (column.default is None or (isinstance(column.default, schema.Sequence) and column.default.optional)): + c = self.proxy("select nextval('%s_%s_seq')" % (column.table.name, column.name)) + return c.fetchone()[0] + else: + return ansisql.ANSIDefaultRunner.get_column_default(self, column) else: return ansisql.ANSIDefaultRunner.get_column_default(self, column) - + def visit_sequence(self, seq): if not seq.optional: c = self.proxy("select nextval('%s')" % seq.name) diff --git a/test/query.py b/test/query.py index 7e084481d6..978325c3fb 100644 --- a/test/query.py +++ b/test/query.py @@ -41,6 +41,29 @@ class QueryTest(PersistTest): self.users.update(self.users.c.user_id == 7).execute(user_name = 'fred') print repr(self.users.select().execute().fetchall()) + def testpassiveoverride(self): + """primarily for postgres, tests that when we get a column back + from reflecting a table which has a default value on it, we pre-execute + that PassiveDefault upon insert, even though PassiveDefault says + "let the database execute this", because in postgres we have to otherwise + we cant locate the inserted row.""" + try: + db.execute(""" + CREATE TABLE speedy_users + ( + speedy_user_id SERIAL PRIMARY KEY, + + user_name VARCHAR NOT NULL, + user_password VARCHAR NOT NULL + ); + """, None) + + t = Table("speedy_users", db, autoload=True) + t.insert().execute(user_name='user', user_password='lala') + l = t.select().execute().fetchall() + self.assert_(l == [(1, 'user', 'lala')]) + finally: + db.execute("drop table speedy_users", None) def testdefaults(self): x = {'x':50} def mydefault():