summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2006-02-18 16:32:33 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2006-02-18 16:32:33 +0000
commitbc784f9556995ff0f4bf42144e55ff38441f065e (patch)
tree3eeff2ccad28fc2c71be205cff38ce2c65c501fa
parent63f11ac1b05988ff74d769e88abe6abc661dc2e6 (diff)
downloadsqlalchemy-bc784f9556995ff0f4bf42144e55ff38441f065e.tar.gz
postgres needs to explicitly pre-execute PassiveDefaults on primary key columns, test added
-rw-r--r--lib/sqlalchemy/databases/postgres.py15
-rw-r--r--test/query.py23
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():