]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
- Repaired issue related to the fix for #208 and others; a composite
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 2 Nov 2014 15:34:58 +0000 (10:34 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 2 Nov 2014 15:34:58 +0000 (10:34 -0500)
foreign key reported by MySQL would cause a KeyError as Alembic
attempted to remove MySQL's implicitly generated indexes from the
autogenerate list.
fixes #240

alembic/ddl/mysql.py
docs/build/changelog.rst
tests/test_autogen_indexes.py

index 7545df7127a95d116f632e1ff24edce4442f0e40..07a32573feb5244291a39de06b755239d34ba4f6 100644 (file)
@@ -92,6 +92,8 @@ class MySQLImpl(DefaultImpl):
                         conn_indexes.remove(idx)
                         removed.add(idx.name)
                         break
+                if idx.name in removed:
+                    break
 
         # then remove indexes from the "metadata_indexes"
         # that we've removed from reflected, otherwise they come out
index a98da19b71d5e0067da26c750c038ca0f4544e48..e9a95bbd016459e81640da4b2addaa283681dd47 100644 (file)
@@ -5,6 +5,15 @@ Changelog
 .. changelog::
     :version: 0.7.0
 
+    .. change::
+      :tags: bug, autogenerate, mysql
+      :tickets: 240
+
+      Repaired issue related to the fix for #208 and others; a composite
+      foreign key reported by MySQL would cause a KeyError as Alembic
+      attempted to remove MySQL's implicitly generated indexes from the
+      autogenerate list.
+
     .. change::
       :tags: bug, autogenerate
       :tickets: 28
index d058fa4737ef169c4f1ca5f04234badf7237b516..53c65366ccd1777e851cedf89999b19574941e30 100644 (file)
@@ -290,6 +290,42 @@ class AutogenerateUniqueIndexTest(AutogenFixtureTest, TestBase):
         diffs = self._fixture(m1, m2)
         eq_(diffs, [])
 
+    def test_nothing_changed_implicit_composite_fk_index_named(self):
+        m1 = MetaData()
+        m2 = MetaData()
+
+        Table("nothing_changed", m1,
+              Column('id', Integer, primary_key=True),
+              Column('other_id_1', Integer),
+              Column('other_id_2', Integer),
+              Column('foo', Integer),
+              ForeignKeyConstraint(
+                  ['other_id_1', 'other_id_2'], ['nc2.id1', 'nc2.id2'],
+                  name='fk_my_table_other_table'
+              ),
+              mysql_engine='InnoDB')
+        Table('nc2', m1,
+              Column('id1', Integer, primary_key=True),
+              Column('id2', Integer, primary_key=True),
+              mysql_engine='InnoDB')
+
+        Table("nothing_changed", m2,
+              Column('id', Integer, primary_key=True),
+              Column('other_id_1', Integer),
+              Column('other_id_2', Integer),
+              Column('foo', Integer),
+              ForeignKeyConstraint(
+                  ['other_id_1', 'other_id_2'], ['nc2.id1', 'nc2.id2'],
+                  name='fk_my_table_other_table'
+              ),
+              mysql_engine='InnoDB')
+        Table('nc2', m2,
+              Column('id1', Integer, primary_key=True),
+              Column('id2', Integer, primary_key=True),
+              mysql_engine='InnoDB')
+        diffs = self._fixture(m1, m2)
+        eq_(diffs, [])
+
     def test_new_idx_index_named_as_column(self):
         m1 = MetaData()
         m2 = MetaData()