From: Mike Bayer Date: Sun, 19 Jan 2014 23:33:45 +0000 (-0500) Subject: - changelog for pullreq 17 X-Git-Tag: rel_0_6_3~13 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d8770ad057f05501c463638249d07ece385827d8;p=thirdparty%2Fsqlalchemy%2Falembic.git - changelog for pullreq 17 - unit tests for schema-level unique/index detection - cleanup a bit for the get indexes/uniques if only table present --- diff --git a/alembic/autogenerate/compare.py b/alembic/autogenerate/compare.py index 95257d11..49f04f12 100644 --- a/alembic/autogenerate/compare.py +++ b/alembic/autogenerate/compare.py @@ -192,27 +192,25 @@ def _compare_indexes_and_uniques(schema, tname, object_filters, conn_table, ) metadata_indexes = set(metadata_table.indexes) - # 1b. ... and from connection - conn_uniques = [] - if conn_table is not None and hasattr(inspector, "get_unique_constraints"): - try: - conn_uniques = inspector.get_unique_constraints(tname, - schema=schema) - except (NotImplementedError, NoSuchTableError): - pass - - conn_indexes = [] + conn_uniques = conn_indexes = frozenset() if conn_table is not None: + # 1b. ... and from connection, if the table exists + if hasattr(inspector, "get_unique_constraints"): + try: + conn_uniques = inspector.get_unique_constraints( + tname, schema=schema) + except NotImplementedError: + pass try: conn_indexes = inspector.get_indexes(tname, schema=schema) - except NoSuchTableError: + except NotImplementedError: pass - # 2. convert conn-level objects from raw inspector records - # into schema objects - conn_uniques = set(_make_unique_constraint(uq_def, conn_table) - for uq_def in conn_uniques) - conn_indexes = set(_make_index(ix, conn_table) for ix in conn_indexes) + # 2. convert conn-level objects from raw inspector records + # into schema objects + conn_uniques = set(_make_unique_constraint(uq_def, conn_table) + for uq_def in conn_uniques) + conn_indexes = set(_make_index(ix, conn_table) for ix in conn_indexes) # 3. give the dialect a chance to omit indexes and constraints that # we know are either added implicitly by the DB or that the DB diff --git a/docs/build/changelog.rst b/docs/build/changelog.rst index f42c525c..df789837 100644 --- a/docs/build/changelog.rst +++ b/docs/build/changelog.rst @@ -5,6 +5,14 @@ Changelog .. changelog:: :version: 0.6.3 + .. change:: + :tags: bug + :pullreq: bitbucket:17 + + Enabled schema support for index and unique constraint autodetection; + previously these were non-functional and could in some cases lead to + attribute errors. Pull request courtesy Dimitris Theodorou. + .. change:: :tags: bug :tickets: 164 diff --git a/tests/test_autogenerate.py b/tests/test_autogenerate.py index 544ac332..79370041 100644 --- a/tests/test_autogenerate.py +++ b/tests/test_autogenerate.py @@ -964,7 +964,7 @@ class AutogenerateUniqueIndexTest(TestCase): eq_(diffs, []) - def _fixture(self, m1, m2): + def _fixture(self, m1, m2, include_schemas=False): self.metadata, model_metadata = m1, m2 self.metadata.create_all(self.bind) @@ -993,6 +993,7 @@ class AutogenerateUniqueIndexTest(TestCase): autogenerate._produce_net_changes(connection, model_metadata, diffs, autogen_context, object_filters=_default_object_filters, + include_schemas=include_schemas ) return diffs @@ -1019,6 +1020,64 @@ class PGUniqueIndexTest(AutogenerateUniqueIndexTest): def _get_bind(cls): return db_for_dialect('postgresql') + def test_idx_added_schema(self): + m1 = MetaData() + m2 = MetaData() + Table('add_ix', m1, Column('x', String(50)), schema="test_schema") + Table('add_ix', m2, Column('x', String(50)), + Index('ix_1', 'x'), schema="test_schema") + + diffs = self._fixture(m1, m2, include_schemas=True) + eq_(diffs[0][0], "add_index") + eq_(diffs[0][1].name, 'ix_1') + + def test_idx_unchanged_schema(self): + m1 = MetaData() + m2 = MetaData() + Table('add_ix', m1, Column('x', String(50)), Index('ix_1', 'x'), + schema="test_schema") + Table('add_ix', m2, Column('x', String(50)), + Index('ix_1', 'x'), schema="test_schema") + + diffs = self._fixture(m1, m2, include_schemas=True) + eq_(diffs, []) + + def test_uq_added_schema(self): + m1 = MetaData() + m2 = MetaData() + Table('add_uq', m1, Column('x', String(50)), schema="test_schema") + Table('add_uq', m2, Column('x', String(50)), + UniqueConstraint('x', name='ix_1'), schema="test_schema") + + diffs = self._fixture(m1, m2, include_schemas=True) + eq_(diffs[0][0], "add_constraint") + eq_(diffs[0][1].name, 'ix_1') + + def test_uq_unchanged_schema(self): + m1 = MetaData() + m2 = MetaData() + Table('add_uq', m1, Column('x', String(50)), + UniqueConstraint('x', name='ix_1'), + schema="test_schema") + Table('add_uq', m2, Column('x', String(50)), + UniqueConstraint('x', name='ix_1'), + schema="test_schema") + + diffs = self._fixture(m1, m2, include_schemas=True) + eq_(diffs, []) + + def test_same_tname_two_schemas(self): + m1 = MetaData() + m2 = MetaData() + + Table('add_ix', m1, Column('x', String(50)), Index('ix_1', 'x')) + + Table('add_ix', m2, Column('x', String(50)), Index('ix_1', 'x')) + Table('add_ix', m2, Column('x', String(50)), schema="test_schema") + + diffs = self._fixture(m1, m2, include_schemas=True) + eq_(diffs[0][0], "add_table") + eq_(len(diffs), 1) class MySQLUniqueIndexTest(AutogenerateUniqueIndexTest): reports_unnamed_constraints = True