From 9650ccfb6841de45efdedb40de5b5f9d3d2f4582 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Wed, 29 Oct 2014 21:01:31 -0400 Subject: [PATCH] - If the "alembic_version" table is present in the target metadata, autogenerate will skip this also. Pull request courtesy Dj Gilcrease. fixes #28 - The :paramref:`.EnvironmentContext.configure.version_table` and :paramref:`.EnvironmentContext.configure.version_table_schema` arguments are now honored during the autogenerate process, such that these names will be used as the "skip" names on both the database reflection and target metadata sides. fixes #77 --- alembic/autogenerate/api.py | 16 +++++--- alembic/migration.py | 6 ++- docs/build/changelog.rst | 18 +++++++++ tests/test_autogenerate.py | 76 ++++++++++++++++++++++++++++++++----- 4 files changed, 100 insertions(+), 16 deletions(-) diff --git a/alembic/autogenerate/api.py b/alembic/autogenerate/api.py index 23d655e2..65ea3ec5 100644 --- a/alembic/autogenerate/api.py +++ b/alembic/autogenerate/api.py @@ -191,7 +191,6 @@ def _produce_net_changes(connection, metadata, diffs, autogen_context, object_filters=(), include_schemas=False): inspector = Inspector.from_engine(connection) - # TODO: not hardcode alembic_version here ? conn_table_names = set() default_schema = connection.dialect.default_schema_name @@ -205,13 +204,20 @@ def _produce_net_changes(connection, metadata, diffs, autogen_context, else: schemas = [None] + version_table_schema = autogen_context['context'].version_table_schema + version_table = autogen_context['context'].version_table + for s in schemas: - tables = set(inspector.get_table_names(schema=s)).\ - difference(['alembic_version']) + tables = set(inspector.get_table_names(schema=s)) + if s == version_table_schema: + tables = tables.difference( + [autogen_context['context'].version_table] + ) conn_table_names.update(zip([s] * len(tables), tables)) - metadata_table_names = OrderedSet([(table.schema, table.name) - for table in metadata.sorted_tables]) + metadata_table_names = OrderedSet( + [(table.schema, table.name) for table in metadata.sorted_tables] + ).difference([(version_table_schema, version_table)]) _compare_tables(conn_table_names, metadata_table_names, object_filters, diff --git a/alembic/migration.py b/alembic/migration.py index 863ba918..a316aa3a 100644 --- a/alembic/migration.py +++ b/alembic/migration.py @@ -92,8 +92,10 @@ class MigrationContext(object): self._user_compare_server_default = opts.get( 'compare_server_default', False) - version_table = opts.get('version_table', 'alembic_version') - version_table_schema = opts.get('version_table_schema', None) + self.version_table = version_table = opts.get( + 'version_table', 'alembic_version') + self.version_table_schema = version_table_schema = \ + opts.get('version_table_schema', None) self._version = Table( version_table, MetaData(), Column('version_num', String(32), nullable=False), diff --git a/docs/build/changelog.rst b/docs/build/changelog.rst index 8702cacd..a98da19b 100644 --- a/docs/build/changelog.rst +++ b/docs/build/changelog.rst @@ -5,6 +5,24 @@ Changelog .. changelog:: :version: 0.7.0 + .. change:: + :tags: bug, autogenerate + :tickets: 28 + + If the "alembic_version" table is present in the target metadata, + autogenerate will skip this also. Pull request courtesy + Dj Gilcrease. + + .. change:: + :tags: bug, autogenerate + :tickets: 77 + + The :paramref:`.EnvironmentContext.configure.version_table` + and :paramref:`.EnvironmentContext.configure.version_table_schema` + arguments are now honored during the autogenerate process, such that + these names will be used as the "skip" names on both the database + reflection and target metadata sides. + .. change:: :tags: changed, autogenerate :tickets: 229 diff --git a/tests/test_autogenerate.py b/tests/test_autogenerate.py index b2ee6714..ce239edd 100644 --- a/tests/test_autogenerate.py +++ b/tests/test_autogenerate.py @@ -44,6 +44,8 @@ class AutogenTest(object): def _get_bind(cls): return config.db + configure_opts = {} + @classmethod def setup_class(cls): staging_env() @@ -53,17 +55,19 @@ class AutogenTest(object): cls.m2 = cls._get_model_schema() conn = cls.bind.connect() + opts = cls.configure_opts.copy() + opts.update({ + 'compare_type': True, + 'compare_server_default': True, + 'target_metadata': cls.m2, + 'upgrade_token': "upgrades", + 'downgrade_token': "downgrades", + 'alembic_module_prefix': 'op.', + 'sqlalchemy_module_prefix': 'sa.', + }) cls.context = context = MigrationContext.configure( connection=conn, - opts={ - 'compare_type': True, - 'compare_server_default': True, - 'target_metadata': cls.m2, - 'upgrade_token': "upgrades", - 'downgrade_token': "downgrades", - 'alembic_module_prefix': 'op.', - 'sqlalchemy_module_prefix': 'sa.', - } + opts=opts ) connection = context.bind @@ -898,6 +902,60 @@ class AutogenKeyTest(AutogenTest, TestBase): eq_(diffs[1][3].key, "otherkey") +class AutogenVersionTableTest(AutogenTest, TestBase): + version_table_name = 'alembic_version' + version_table_schema = None + + @classmethod + def _get_db_schema(cls): + m = MetaData() + Table( + cls.version_table_name, m, + Column('x', Integer), schema=cls.version_table_schema) + return m + + @classmethod + def _get_model_schema(cls): + m = MetaData() + return m + + def test_no_version_table(self): + diffs = [] + autogenerate._produce_net_changes(self.context.bind, self.m2, + diffs, self.autogen_context) + eq_(diffs, []) + + def test_version_table_in_target(self): + diffs = [] + Table( + self.version_table_name, + self.m2, Column('x', Integer), schema=self.version_table_schema) + + autogenerate._produce_net_changes(self.context.bind, self.m2, + diffs, self.autogen_context) + eq_(diffs, []) + + +class AutogenCustomVersionTableSchemaTest(AutogenVersionTableTest): + __only_on__ = 'postgresql' + version_table_schema = 'test_schema' + configure_opts = {'version_table_schema': 'test_schema'} + + +class AutogenCustomVersionTableTest(AutogenVersionTableTest): + version_table_name = 'my_version_table' + configure_opts = {'version_table': 'my_version_table'} + + +class AutogenCustomVersionTableAndSchemaTest(AutogenVersionTableTest): + __only_on__ = 'postgresql' + version_table_name = 'my_version_table' + version_table_schema = 'test_schema' + configure_opts = { + 'version_table': 'my_version_table', + 'version_table_schema': 'test_schema'} + + class AutogenerateDiffOrderTest(AutogenTest, TestBase): @classmethod -- 2.47.3