]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
- Added a rule for Postgresql to not render a "drop unique" and "drop index"
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 21 Nov 2014 19:20:36 +0000 (14:20 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 21 Nov 2014 19:23:01 +0000 (14:23 -0500)
given the same name; for now it is assumed that the "index" is the
implicit one Postgreql generates.   Future integration with
new SQLAlchemy 1.0 features will improve this to be more
resilient.
fixes #247

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

index bba67404fa48a8d83a09c7689e9e2c59786bd91b..3a352082db494111eb908134ff913ab7a919266c 100644 (file)
@@ -119,6 +119,7 @@ def _compare_tables(conn_table_names, metadata_table_names,
 
 
 def _make_index(params, conn_table):
+    # TODO: add .info such as 'duplicates_constraint'
     return sa_schema.Index(
         params['name'],
         *[conn_table.c[cname] for cname in params['column_names']],
@@ -127,6 +128,7 @@ def _make_index(params, conn_table):
 
 
 def _make_unique_constraint(params, conn_table):
+    # TODO: add .info such as 'duplicates_index'
     return sa_schema.UniqueConstraint(
         *[conn_table.c[cname] for cname in params['column_names']],
         name=params['name']
index 29973fe4c05d1f98a9b8c164a3e5a44fb7c58dd2..aac8184bdf190da8608b1ce05597cea59286a4ee 100644 (file)
@@ -92,6 +92,10 @@ class MySQLImpl(DefaultImpl):
                                         conn_indexes,
                                         metadata_unique_constraints,
                                         metadata_indexes):
+
+        # TODO: if SQLA 1.0, make use of "duplicates_index"
+        # metadata
+
         removed = set()
         for idx in list(conn_indexes):
             # MySQL puts implicit indexes on FK columns, even if
index 5156ceafa30f856770771c638c8284a95d5141e1..0877c959e646ddf328b558a043ecd5f666fefc48 100644 (file)
@@ -75,6 +75,25 @@ class PostgresqlImpl(DefaultImpl):
                         # its a SERIAL - whack it!
                         del column_info['default']
 
+    def correct_for_autogen_constraints(self, conn_unique_constraints,
+                                        conn_indexes,
+                                        metadata_unique_constraints,
+                                        metadata_indexes):
+        conn_uniques_by_name = dict(
+            (c.name, c) for c in conn_unique_constraints)
+        conn_indexes_by_name = dict(
+            (c.name, c) for c in conn_indexes)
+
+        # TODO: if SQLA 1.0, make use of "duplicates_constraint"
+        # metadata
+        doubled_constraints = dict(
+            (name, (conn_uniques_by_name[name], conn_indexes_by_name[name]))
+            for name in set(conn_uniques_by_name).intersection(
+                conn_indexes_by_name)
+        )
+        for name, (uq, ix) in doubled_constraints.items():
+            conn_indexes.remove(ix)
+
 
 @compiles(RenameTable, "postgresql")
 def visit_rename_table(element, compiler, **kw):
index 0fb0bb42ad681ab64e659f39c1bee4b76203f319..36a5e773a492d87ad2904d2845a818a8e91db7e9 100644 (file)
@@ -56,6 +56,16 @@ Changelog
 
           :ref:`batch_migrations`
 
+    .. change::
+      :tags: bug, autogenerate, postgresql
+      :tickets: 247
+
+      Added a rule for Postgresql to not render a "drop unique" and "drop index"
+      given the same name; for now it is assumed that the "index" is the
+      implicit one Postgreql generates.   Future integration with
+      new SQLAlchemy 1.0 features will improve this to be more
+      resilient.
+
     .. change::
       :tags: bug, autogenerate
       :tickets: 247
index 86d4af69d4c8f8dfe194d7b0a9ab9887f1e17594..ad839c8317d480627b318513aef6a8032457a1b6 100644 (file)
@@ -553,6 +553,25 @@ class PGUniqueIndexTest(AutogenerateUniqueIndexTest):
         eq_(diffs[0][0], "add_table")
         eq_(len(diffs), 1)
 
+    def test_uq_dropped(self):
+        m1 = MetaData()
+        m2 = MetaData()
+        Table(
+            'add_uq', m1,
+            Column('id', Integer, primary_key=True),
+            Column('name', String),
+            UniqueConstraint('name', name='uq_name')
+        )
+        Table(
+            'add_uq', m2,
+            Column('id', Integer, primary_key=True),
+            Column('name', String),
+        )
+        diffs = self._fixture(m1, m2, include_schemas=True)
+        eq_(diffs[0][0], "remove_constraint")
+        eq_(diffs[0][1].name, "uq_name")
+        eq_(len(diffs), 1)
+
 
 class MySQLUniqueIndexTest(AutogenerateUniqueIndexTest):
     reports_unnamed_constraints = True