summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2013-10-14 14:53:28 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2013-10-14 14:56:45 -0400
commit621c22ca31eb395c4c47e313a00b1708b76d0017 (patch)
tree0f02efabbdf130962550416164c2a92074acdc1e
parent5389bc5d8d6e72bdf7bf937de77201d6d2a58759 (diff)
downloadsqlalchemy-621c22ca31eb395c4c47e313a00b1708b76d0017.tar.gz
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
-rw-r--r--doc/build/changelog/changelog_08.rst10
-rw-r--r--lib/sqlalchemy/schema.py7
-rw-r--r--test/sql/test_metadata.py22
3 files changed, 38 insertions, 1 deletions
diff --git a/doc/build/changelog/changelog_08.rst b/doc/build/changelog/changelog_08.rst
index f147fcfed..2326d6216 100644
--- a/doc/build/changelog/changelog_08.rst
+++ b/doc/build/changelog/changelog_08.rst
@@ -11,6 +11,16 @@
: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
:versions: 0.9.0
diff --git a/lib/sqlalchemy/schema.py b/lib/sqlalchemy/schema.py
index 641650d32..bdf6bd169 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 3075d3685..c4b73d1d5 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')