From bc784f9556995ff0f4bf42144e55ff38441f065e Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sat, 18 Feb 2006 16:32:33 +0000 Subject: [PATCH] postgres needs to explicitly pre-execute PassiveDefaults on primary key columns, test added --- lib/sqlalchemy/databases/postgres.py | 15 +++++++++++---- test/query.py | 23 +++++++++++++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) 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(): -- 2.47.2