]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- added "explcit" create/drop/execute support for sequences
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 15 Jun 2007 16:51:25 +0000 (16:51 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 15 Jun 2007 16:51:25 +0000 (16:51 +0000)
(i.e. you can pass a "connectable" to each of those methods
on Sequence)
- checkfirst flag propigates for sequence creates/drops

CHANGES
lib/sqlalchemy/databases/oracle.py
lib/sqlalchemy/databases/postgres.py
lib/sqlalchemy/schema.py
test/sql/defaults.py

diff --git a/CHANGES b/CHANGES
index 9a4d9e2093e648aafb8ee339ed595352852bbf9b..e65b09f68baa3b74a83ff368a8acfb56980e58d3 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -41,7 +41,9 @@
      would not return selectable.c.col, if the selectable is a join
      of a table and another join involving the same table.  messed
      up ORM decision making [ticket:593]
-
+  - added "explcit" create/drop/execute support for sequences 
+    (i.e. you can pass a "connectable" to each of those methods
+    on Sequence)
 
 - mysql
   - added 'fields' to reserved words [ticket:590]
index 98226a8064c1fc0326b7f4e1e3e40fa7ee2459ee..e591ebc7533996c5d1cfd1ad5910dfd4f49a2317 100644 (file)
@@ -589,13 +589,13 @@ class OracleSchemaGenerator(ansisql.ANSISchemaGenerator):
         return colspec
 
     def visit_sequence(self, sequence):
-        if not self.dialect.has_sequence(self.connection, sequence.name):
+        if not self.checkfirst  or not self.dialect.has_sequence(self.connection, sequence.name):
             self.append("CREATE SEQUENCE %s" % self.preparer.format_sequence(sequence))
             self.execute()
 
 class OracleSchemaDropper(ansisql.ANSISchemaDropper):
     def visit_sequence(self, sequence):
-        if self.dialect.has_sequence(self.connection, sequence.name):
+        if not self.checkfirst or self.dialect.has_sequence(self.connection, sequence.name):
             self.append("DROP SEQUENCE %s" % sequence.name)
             self.execute()
 
index 7573b5a8d7077b16ea8de72265617f863cc170a2..b48a709d8c14c82f770355688d91cb7c68488cb8 100644 (file)
@@ -467,13 +467,13 @@ class PGSchemaGenerator(ansisql.ANSISchemaGenerator):
         return colspec
 
     def visit_sequence(self, sequence):
-        if not sequence.optional and (not self.dialect.has_sequence(self.connection, sequence.name)):
+        if not sequence.optional and (not self.checkfirst or not self.dialect.has_sequence(self.connection, sequence.name)):
             self.append("CREATE SEQUENCE %s" % self.preparer.format_sequence(sequence))
             self.execute()
 
 class PGSchemaDropper(ansisql.ANSISchemaDropper):
     def visit_sequence(self, sequence):
-        if not sequence.optional and (self.dialect.has_sequence(self.connection, sequence.name)):
+        if not sequence.optional and (not self.checkfirst or self.dialect.has_sequence(self.connection, sequence.name)):
             self.append("DROP SEQUENCE %s" % sequence.name)
             self.execute()
 
index 02cd69df77e5038166cf1ec8f30ce421b2dffa15..5b2d229c4b57f461e0442f2927ba0a92d78ad934 100644 (file)
@@ -60,9 +60,11 @@ class SchemaItem(object):
 
         return self._derived_metadata().engine
 
-    def get_engine(self):
+    def get_engine(self, connectable=None):
         """Return the engine or raise an error if no engine."""
 
+        if connectable is not None:
+            return connectable
         e = self._get_engine()
         if e is not None:
             return e
@@ -762,8 +764,8 @@ class DefaultGenerator(SchemaItem):
         else:
             self.column.default = self
 
-    def execute(self, **kwargs):
-        return self.get_engine().execute_default(self, **kwargs)
+    def execute(self, connectable=None, **kwargs):
+        return self.get_engine(connectable=connectable).execute_default(self, **kwargs)
 
     def __repr__(self):
         return "DefaultGenerator()"
@@ -825,12 +827,12 @@ class Sequence(DefaultGenerator):
         super(Sequence, self)._set_parent(column)
         column.sequence = self
 
-    def create(self):
-       self.get_engine().create(self)
+    def create(self, connectable=None, checkfirst=True):
+       self.get_engine(connectable=connectable).create(self, checkfirst=checkfirst)
        return self
 
-    def drop(self):
-       self.get_engine().drop(self)
+    def drop(self, connectable=None, checkfirst=True):
+       self.get_engine(connectable=connectable).drop(self, checkfirst=checkfirst)
 
     def accept_visitor(self, visitor):
         """Call the visit_seauence method on the given visitor."""
index 840688afba7953c65cb59ad2b904d7d388966d59..d4cb9e9f362d0f397fabf754d7ced5ba0cfe34d5 100644 (file)
@@ -255,7 +255,7 @@ class SequenceTest(PersistTest):
    
    
     @testbase.supported('postgres', 'oracle')
-    def teststandalone(self):
+    def test_implicit_sequence_exec(self):
         s = Sequence("my_sequence", metadata=testbase.db)
         s.create()
         try:
@@ -263,7 +263,25 @@ class SequenceTest(PersistTest):
             self.assert_(x == 1)
         finally:
             s.drop()
+
+    @testbase.supported('postgres', 'oracle')
+    def test_explicit_sequence_exec(self):
+        s = Sequence("my_sequence")
+        s.create(testbase.db)
+        try:
+            x = s.execute(testbase.db)
+            self.assert_(x == 1)
+        finally:
+            s.drop(testbase.db)
     
+    @testbase.supported('postgres', 'oracle')
+    def test_checkfirst(self):
+        s = Sequence("my_sequence")
+        s.create(testbase.db, checkfirst=False)
+        s.create(testbase.db, checkfirst=True)
+        s.drop(testbase.db, checkfirst=False)
+        s.drop(testbase.db, checkfirst=True)
+        
     @testbase.supported('postgres', 'oracle')
     def teststandalone2(self):
         x = cartitems.c.cart_id.sequence.execute()