]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
- changelog for pullreq 17
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 19 Jan 2014 23:33:45 +0000 (18:33 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 19 Jan 2014 23:33:45 +0000 (18:33 -0500)
- unit tests for schema-level unique/index detection
- cleanup a bit for the get indexes/uniques if only table present

alembic/autogenerate/compare.py
docs/build/changelog.rst
tests/test_autogenerate.py

index 95257d118b5bb2a2316a4c7991909c2274a2240c..49f04f12566fc1f16eae17b8f4d10b441fc53242 100644 (file)
@@ -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
index f42c525cf52160c43611c31e9660e7316bef7630..df7898374c35db10567f137b4f6f57ba045307b7 100644 (file)
@@ -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
index 544ac33299f66090f5c8b96e9599931ca01ca4b1..793700415b3d148ca4a09f50b21860dd8f2d6062 100644 (file)
@@ -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