]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
- If the "alembic_version" table is present in the target metadata,
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 30 Oct 2014 01:01:31 +0000 (21:01 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 30 Oct 2014 01:02:29 +0000 (21:02 -0400)
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
alembic/migration.py
docs/build/changelog.rst
tests/test_autogenerate.py

index 23d655e2b7660368f633ae4f4d05bda733ddacfc..65ea3ec5c409f56bf485daed52cdac858b714e89 100644 (file)
@@ -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,
index 863ba918208d96b51f33ae07f13c0a031586fd44..a316aa3aa08c6f6944543d0717705db1ff6dc346 100644 (file)
@@ -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),
index 8702cacd4f61d2159d24d67d519f901adbeb97e5..a98da19b71d5e0067da26c750c038ca0f4544e48 100644 (file)
@@ -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
index b2ee6714af9ddea3e2cf307dadbf33641ebe99ff..ce239eddad0eff4f450142a4bf61938e18cc2c81 100644 (file)
@@ -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