]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- [bug] Fixed bug in "mock" strategy whereby
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 28 Jan 2012 19:29:26 +0000 (14:29 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 28 Jan 2012 19:29:26 +0000 (14:29 -0500)
correct DDL visit method wasn't called, resulting
in "CREATE/DROP SEQUENCE" statements being
duplicated [ticket:2384]

CHANGES
lib/sqlalchemy/engine/strategies.py
test/engine/test_execute.py

diff --git a/CHANGES b/CHANGES
index cf25308cae3e7e9fce68af92657ffa558f89314c..85a705ea73888e4828bff8fa70121257a7f07b07 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -102,6 +102,11 @@ CHANGES
     inappropriately when targeting in a result
     set row.  [ticket:2377]
 
+  - [bug] Fixed bug in "mock" strategy whereby
+    correct DDL visit method wasn't called, resulting
+    in "CREATE/DROP SEQUENCE" statements being 
+    duplicated [ticket:2384]
+
 - sqlite
   - [bug] the "name" of an FK constraint in SQLite
     is reflected as "None", not "0" or other 
index 1902b04c4bf40602f34be22f093a82ee70dc2560..7b2da68c4806e6acbe1798f8958ec8347130f5f9 100644 (file)
@@ -234,19 +234,19 @@ class MockEngineStrategy(EngineStrategy):
             kwargs['checkfirst'] = False
             from sqlalchemy.engine import ddl
 
-            ddl.SchemaGenerator(self.dialect, self, **kwargs).traverse(entity)
+            ddl.SchemaGenerator(self.dialect, self, **kwargs).traverse_single(entity)
 
         def drop(self, entity, **kwargs):
             kwargs['checkfirst'] = False
             from sqlalchemy.engine import ddl
-            ddl.SchemaDropper(self.dialect, self, **kwargs).traverse(entity)
+            ddl.SchemaDropper(self.dialect, self, **kwargs).traverse_single(entity)
 
         def _run_visitor(self, visitorcallable, element, 
                                         connection=None, 
                                         **kwargs):
             kwargs['checkfirst'] = False
             visitorcallable(self.dialect, self,
-                                **kwargs).traverse(element)
+                                **kwargs).traverse_single(element)
 
         def execute(self, object, *multiparams, **params):
             raise NotImplementedError()
index e05732eb177e6be6d0ded353ea4f8ee7322834cf..313e5b3b7c15294db0669df36cde661aab48d556 100644 (file)
@@ -3,7 +3,7 @@ import re
 from test.lib.util import picklers
 from sqlalchemy.interfaces import ConnectionProxy
 from sqlalchemy import MetaData, Integer, String, INT, VARCHAR, func, \
-    bindparam, select, event, TypeDecorator
+    bindparam, select, event, TypeDecorator, create_engine, Sequence
 from sqlalchemy.sql import column, literal
 from test.lib.schema import Table, Column
 import sqlalchemy as tsa
@@ -14,6 +14,7 @@ from sqlalchemy.dialects.oracle.zxjdbc import ReturningParam
 from sqlalchemy.engine import base, default
 from sqlalchemy.engine.base import Connection, Engine
 from test.lib import fixtures
+import StringIO
 
 users, metadata = None, None
 class ExecuteTest(fixtures.TestBase):
@@ -571,6 +572,34 @@ class EchoTest(fixtures.TestBase):
         assert self.buf.buffer[2].getMessage().startswith("SELECT 6")
         assert len(self.buf.buffer) == 4
 
+class MockStrategyTest(fixtures.TestBase):
+    def _engine_fixture(self):
+        buf = StringIO.StringIO()
+        def dump(sql, *multiparams, **params):
+            buf.write(sql.compile(dialect=engine.dialect))
+        engine = create_engine('postgresql://', strategy='mock', executor=dump)
+        return engine, buf
+
+    def test_sequence_not_duped(self):
+        engine, buf = self._engine_fixture()
+        metadata = MetaData()
+        t = Table('testtable', metadata,
+           Column('pk', Integer, Sequence('testtable_pk_seq'), primary_key=True)
+        )
+
+        t.create(engine)
+        t.drop(engine)
+
+        eq_(
+            re.findall(r'CREATE (\w+)', buf.getvalue()),
+            ["SEQUENCE", "TABLE"]
+        )
+
+        eq_(
+            re.findall(r'DROP (\w+)', buf.getvalue()),
+            ["SEQUENCE", "TABLE"]
+        )
+
 class ResultProxyTest(fixtures.TestBase):
 
     def test_nontuple_row(self):