]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
postgres needs to explicitly pre-execute PassiveDefaults on primary key columns,...
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 18 Feb 2006 16:32:33 +0000 (16:32 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 18 Feb 2006 16:32:33 +0000 (16:32 +0000)
lib/sqlalchemy/databases/postgres.py
test/query.py

index d93a084ee560d1c419cf85e7b0dbf6d1fe865c8c..a5b5b250dc20dfd6c4d7288e4fe3218e97846e8f 100644 (file)
@@ -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)
index 7e084481d624ecb3d66d356211034118b2011804..978325c3fb3a4f6749deeff2c70c300eaa207a62 100644 (file)
@@ -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():