From: Mike Bayer Date: Fri, 15 Jun 2007 16:51:25 +0000 (+0000) Subject: - added "explcit" create/drop/execute support for sequences X-Git-Tag: rel_0_4_6~198 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4b3af119f7e29f9b0ea4e9d88ebedb9d62348c87;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - added "explcit" create/drop/execute support for sequences (i.e. you can pass a "connectable" to each of those methods on Sequence) - checkfirst flag propigates for sequence creates/drops --- diff --git a/CHANGES b/CHANGES index 9a4d9e2093..e65b09f68b 100644 --- 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] diff --git a/lib/sqlalchemy/databases/oracle.py b/lib/sqlalchemy/databases/oracle.py index 98226a8064..e591ebc753 100644 --- a/lib/sqlalchemy/databases/oracle.py +++ b/lib/sqlalchemy/databases/oracle.py @@ -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() diff --git a/lib/sqlalchemy/databases/postgres.py b/lib/sqlalchemy/databases/postgres.py index 7573b5a8d7..b48a709d8c 100644 --- a/lib/sqlalchemy/databases/postgres.py +++ b/lib/sqlalchemy/databases/postgres.py @@ -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() diff --git a/lib/sqlalchemy/schema.py b/lib/sqlalchemy/schema.py index 02cd69df77..5b2d229c4b 100644 --- a/lib/sqlalchemy/schema.py +++ b/lib/sqlalchemy/schema.py @@ -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.""" diff --git a/test/sql/defaults.py b/test/sql/defaults.py index 840688afba..d4cb9e9f36 100644 --- a/test/sql/defaults.py +++ b/test/sql/defaults.py @@ -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()