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)
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():