diff options
| -rw-r--r-- | doc/build/changelog/changelog_10.rst | 8 | ||||
| -rw-r--r-- | lib/sqlalchemy/sql/schema.py | 8 | ||||
| -rw-r--r-- | test/sql/test_metadata.py | 28 |
3 files changed, 43 insertions, 1 deletions
diff --git a/doc/build/changelog/changelog_10.rst b/doc/build/changelog/changelog_10.rst index 5f9521c47..b59ab392e 100644 --- a/doc/build/changelog/changelog_10.rst +++ b/doc/build/changelog/changelog_10.rst @@ -19,6 +19,14 @@ :version: 1.0.14 .. change:: + :tags: bug, sql + :tickets: 3721 + + Fixed bug whereby :meth:`.Table.tometadata` would make a duplicate + :class:`.UniqueConstraint` for each :class:`.Column` object that + featured the ``unique=True`` parameter. + + .. change:: :tags: bug, engine, postgresql :tickets: 3716 diff --git a/lib/sqlalchemy/sql/schema.py b/lib/sqlalchemy/sql/schema.py index 64692644c..cb01a49e3 100644 --- a/lib/sqlalchemy/sql/schema.py +++ b/lib/sqlalchemy/sql/schema.py @@ -852,8 +852,14 @@ class Table(DialectKWArgs, SchemaItem, TableClause): schema if referred_schema == self.schema else None) table.append_constraint( c.copy(schema=fk_constraint_schema, target_table=table)) - elif not c._type_bound: + # skip unique constraints that would be generated + # by the 'unique' flag on Column + if isinstance(c, UniqueConstraint) and \ + len(c.columns) == 1 and \ + list(c.columns)[0].unique: + continue + table.append_constraint( c.copy(schema=schema, target_table=table)) for index in self.indexes: diff --git a/test/sql/test_metadata.py b/test/sql/test_metadata.py index 449956fcd..344cfefa5 100644 --- a/test/sql/test_metadata.py +++ b/test/sql/test_metadata.py @@ -1113,6 +1113,34 @@ class ToMetaDataTest(fixtures.TestBase, ComparesTables): eq_(str(table_c.join(table2_c).onclause), 'mytable.myid = othertable.myid') + def test_unique_true_flag(self): + meta = MetaData() + + table = Table('mytable', meta, Column('x', Integer, unique=True)) + + m2 = MetaData() + + t2 = table.tometadata(m2) + + eq_( + len([ + const for const + in t2.constraints + if isinstance(const, UniqueConstraint)]), + 1 + ) + + def test_index_true_flag(self): + meta = MetaData() + + table = Table('mytable', meta, Column('x', Integer, index=True)) + + m2 = MetaData() + + t2 = table.tometadata(m2) + + eq_(len(t2.indexes), 1) + class InfoTest(fixtures.TestBase): def test_metadata_info(self): |
