From: Mike Bayer Date: Sun, 2 Nov 2014 15:34:58 +0000 (-0500) Subject: - Repaired issue related to the fix for #208 and others; a composite X-Git-Tag: rel_0_7_1~11^2~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b16bdf8789cc3f16fd6a5a94288ba204646bbc23;p=thirdparty%2Fsqlalchemy%2Falembic.git - 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. fixes #240 --- diff --git a/alembic/ddl/mysql.py b/alembic/ddl/mysql.py index 7545df71..07a32573 100644 --- a/alembic/ddl/mysql.py +++ b/alembic/ddl/mysql.py @@ -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 diff --git a/docs/build/changelog.rst b/docs/build/changelog.rst index a98da19b..e9a95bbd 100644 --- a/docs/build/changelog.rst +++ b/docs/build/changelog.rst @@ -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 diff --git a/tests/test_autogen_indexes.py b/tests/test_autogen_indexes.py index d058fa47..53c65366 100644 --- a/tests/test_autogen_indexes.py +++ b/tests/test_autogen_indexes.py @@ -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()