def __init__(self, const: UniqueConstraint) -> None:
self.const = const
self.name = const.name
- self.sig = tuple(sorted([col.name for col in const.columns]))
+ self.sig = ("UNIQUE_CONSTRAINT",) + tuple(
+ sorted([col.name for col in const.columns])
+ )
@property
def column_names(self) -> List[str]:
def __init__(self, const: Index, impl: DefaultImpl) -> None:
self.const = const
self.name = const.name
- self.sig = impl.create_index_sig(const)
+ self.sig = ("INDEX",) + impl.create_index_sig(const)
self.is_unique = bool(const.unique)
def md_name_to_sql_name(self, context: AutogenContext) -> Optional[str]:
if not conn_obj.is_index and conn_obj.sig in unnamed_metadata_uniques:
continue
elif removed_name in doubled_constraints:
+ conn_uq, conn_idx = doubled_constraints[removed_name]
if (
- conn_obj.sig not in metadata_indexes_by_sig
- and conn_obj.sig not in metadata_uniques_by_sig
+ conn_idx.sig not in metadata_indexes_by_sig
+ and conn_uq.sig not in metadata_uniques_by_sig
):
- conn_uq, conn_idx = doubled_constraints[removed_name]
obj_removed(conn_uq)
obj_removed(conn_idx)
else:
diffs = self._fixture(m1, m2)
eq_(diffs, [])
+ @config.requirements.unique_constraint_reflection
+ def test_nothing_changed_cols_unsorted(self):
+ """test #1240
+
+
+ MySQL doubles unique constraints as indexes, so we need to make
+ sure we aren't comparing index sigs to unique constraint sigs,
+ which we were doing previously by mistake. As their signatures
+ were compatible, things "worked" but once index sigs changed
+ col name sorting order, it broke.
+
+ """
+
+ m1 = MetaData()
+ m2 = MetaData()
+
+ Table(
+ "nothing_changed",
+ m1,
+ Column("id", Integer, primary_key=True),
+ Column("sid", Integer, nullable=False),
+ Column("label", String(30), nullable=False),
+ Column("fid", Integer, nullable=False),
+ UniqueConstraint("sid", "label"),
+ UniqueConstraint("sid", "fid"),
+ )
+
+ Table(
+ "nothing_changed",
+ m2,
+ Column("id", Integer, primary_key=True),
+ Column("sid", Integer, nullable=False),
+ Column("label", String(30), nullable=False),
+ Column("fid", Integer, nullable=False),
+ UniqueConstraint("sid", "label"),
+ UniqueConstraint("sid", "fid"),
+ )
+
+ diffs = self._fixture(m1, m2)
+ eq_(diffs, [])
+
+ @config.requirements.unique_constraint_reflection
+ @config.requirements.reports_unnamed_constraints
+ def test_remove_uq_constraint(self):
+ """supplementary test for codepath in #1240"""
+
+ m1 = MetaData()
+ m2 = MetaData()
+
+ Table(
+ "something_changed",
+ m1,
+ Column("id", Integer, primary_key=True),
+ Column("sid", Integer, nullable=False),
+ Column("label", String(30), nullable=False),
+ Column("fid", Integer, nullable=False),
+ UniqueConstraint("sid", "label"),
+ UniqueConstraint("sid", "fid"),
+ )
+
+ Table(
+ "something_changed",
+ m2,
+ Column("id", Integer, primary_key=True),
+ Column("sid", Integer, nullable=False),
+ Column("label", String(30), nullable=False),
+ Column("fid", Integer, nullable=False),
+ UniqueConstraint("sid", "fid"),
+ )
+
+ diffs = self._fixture(m1, m2)
+ assert len(diffs) == 1
+ assert diffs[0][0] in ("remove_index", "remove_constraint")
+
@config.requirements.unique_constraint_reflection
def test_uq_casing_convention_changed_so_put_drops_first(self):
m1 = MetaData()