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']],
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']
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
# 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):
: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
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