From: Mike Bayer Date: Mon, 14 Oct 2013 18:53:28 +0000 (-0400) Subject: The ``.unique`` flag on :class:`.Index` could be produced as ``None`` X-Git-Tag: rel_0_8_3~11 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=621c22ca31eb395c4c47e313a00b1708b76d0017;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git 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] Conflicts: lib/sqlalchemy/sql/schema.py --- diff --git a/doc/build/changelog/changelog_08.rst b/doc/build/changelog/changelog_08.rst index f147fcfeda..2326d62161 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/schema.py b/lib/sqlalchemy/schema.py index 641650d32a..bdf6bd1695 100644 --- a/lib/sqlalchemy/schema.py +++ b/lib/sqlalchemy/schema.py @@ -939,8 +939,13 @@ class Column(SchemaItem, expression.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.quote = kwargs.pop('quote', None) self.doc = kwargs.pop('doc', None) @@ -1092,7 +1097,7 @@ class Column(SchemaItem, expression.ColumnClause): "To create indexes with a specific name, create an " "explicit Index object external to the Table.") Index(expression._truncated_label('ix_%s' % self._label), - self, unique=self.unique) + self, unique=bool(self.unique)) elif self.unique: if isinstance(self.unique, basestring): raise exc.ArgumentError( diff --git a/test/sql/test_metadata.py b/test/sql/test_metadata.py index 3075d3685c..c4b73d1d5f 100644 --- a/test/sql/test_metadata.py +++ b/test/sql/test_metadata.py @@ -1309,6 +1309,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')