summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES5
-rw-r--r--lib/sqlalchemy/engine/strategies.py6
-rw-r--r--test/engine/test_execute.py31
3 files changed, 38 insertions, 4 deletions
diff --git a/CHANGES b/CHANGES
index cf25308ca..85a705ea7 100644
--- 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
diff --git a/lib/sqlalchemy/engine/strategies.py b/lib/sqlalchemy/engine/strategies.py
index 1902b04c4..7b2da68c4 100644
--- a/lib/sqlalchemy/engine/strategies.py
+++ b/lib/sqlalchemy/engine/strategies.py
@@ -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()
diff --git a/test/engine/test_execute.py b/test/engine/test_execute.py
index e05732eb1..313e5b3b7 100644
--- a/test/engine/test_execute.py
+++ b/test/engine/test_execute.py
@@ -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):