diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2006-02-18 16:32:33 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2006-02-18 16:32:33 +0000 |
commit | bc784f9556995ff0f4bf42144e55ff38441f065e (patch) | |
tree | 3eeff2ccad28fc2c71be205cff38ce2c65c501fa | |
parent | 63f11ac1b05988ff74d769e88abe6abc661dc2e6 (diff) | |
download | sqlalchemy-bc784f9556995ff0f4bf42144e55ff38441f065e.tar.gz |
postgres needs to explicitly pre-execute PassiveDefaults on primary key columns, test added
-rw-r--r-- | lib/sqlalchemy/databases/postgres.py | 15 | ||||
-rw-r--r-- | 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 d93a084ee..a5b5b250d 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 7e084481d..978325c3f 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(): |