From 78a38967c4ad94194308f77f60a922236cd75227 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Mon, 14 Oct 2013 14:53:28 -0400 Subject: [PATCH] The ``.unique`` flag on :class:`.Index` could be produced as ``None`` if it was generated from a :class:`.Column` that didn't specify ``unique`` (where it defaults to ``None``). The flag will now always be ``True`` or ``False``. [ticket:2825] --- doc/build/changelog/changelog_08.rst | 10 ++++++++++ lib/sqlalchemy/sql/schema.py | 7 ++++++- test/sql/test_metadata.py | 22 ++++++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/doc/build/changelog/changelog_08.rst b/doc/build/changelog/changelog_08.rst index 38da8b9163..054227bd72 100644 --- a/doc/build/changelog/changelog_08.rst +++ b/doc/build/changelog/changelog_08.rst @@ -10,6 +10,16 @@ .. changelog:: :version: 0.8.3 + .. change:: + :tags: bug, sql + :tickets: 2825 + :versions: 0.9.0 + + The ``.unique`` flag on :class:`.Index` could be produced as ``None`` + if it was generated from a :class:`.Column` that didn't specify ``unique`` + (where it defaults to ``None``). The flag will now always be ``True`` or + ``False``. + .. change:: :tags: feature, orm :tickets: 2836 diff --git a/lib/sqlalchemy/sql/schema.py b/lib/sqlalchemy/sql/schema.py index fe331ce2ee..90c4fb0dd3 100644 --- a/lib/sqlalchemy/sql/schema.py +++ b/lib/sqlalchemy/sql/schema.py @@ -977,8 +977,13 @@ class Column(SchemaItem, ColumnClause): self.default = kwargs.pop('default', None) self.server_default = kwargs.pop('server_default', None) self.server_onupdate = kwargs.pop('server_onupdate', None) + + # these default to None because .index and .unique is *not* + # an informational flag about Column - there can still be an + # Index or UniqueConstraint referring to this Column. self.index = kwargs.pop('index', None) self.unique = kwargs.pop('unique', None) + self.system = kwargs.pop('system', False) self.doc = kwargs.pop('doc', None) self.onupdate = kwargs.pop('onupdate', None) @@ -1126,7 +1131,7 @@ class Column(SchemaItem, ColumnClause): "To create indexes with a specific name, create an " "explicit Index object external to the Table.") Index(_truncated_label('ix_%s' % self._label), - self, unique=self.unique) + self, unique=bool(self.unique)) elif self.unique: if isinstance(self.unique, util.string_types): raise exc.ArgumentError( diff --git a/test/sql/test_metadata.py b/test/sql/test_metadata.py index 1da833d9f4..883d9308c0 100644 --- a/test/sql/test_metadata.py +++ b/test/sql/test_metadata.py @@ -1560,6 +1560,28 @@ class ColumnDefinitionTest(AssertsCompiledSQL, fixtures.TestBase): assert c.name == 'named' assert c.name == c.key + def test_unique_index_flags_default_to_none(self): + c = Column(Integer) + eq_(c.unique, None) + eq_(c.index, None) + + c = Column('c', Integer, index=True) + eq_(c.unique, None) + eq_(c.index, True) + + t = Table('t', MetaData(), c) + eq_(list(t.indexes)[0].unique, False) + + c = Column(Integer, unique=True) + eq_(c.unique, True) + eq_(c.index, None) + + c = Column('c', Integer, index=True, unique=True) + eq_(c.unique, True) + eq_(c.index, True) + + t = Table('t', MetaData(), c) + eq_(list(t.indexes)[0].unique, True) def test_bogus(self): assert_raises(exc.ArgumentError, Column, 'foo', name='bar') -- 2.47.3