From: Mike Bayer Date: Sat, 28 Jan 2012 19:29:26 +0000 (-0500) Subject: - [bug] Fixed bug in "mock" strategy whereby X-Git-Tag: rel_0_7_5~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=780cd9dce4b2d2c304512a237f2a3c1055542e75;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - [bug] Fixed bug in "mock" strategy whereby correct DDL visit method wasn't called, resulting in "CREATE/DROP SEQUENCE" statements being duplicated [ticket:2384] --- diff --git a/CHANGES b/CHANGES index cf25308cae..85a705ea73 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 1902b04c4b..7b2da68c48 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 e05732eb17..313e5b3b7c 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):