]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
The ``.unique`` flag on :class:`.Index` could be produced as ``None``
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 14 Oct 2013 18:53:28 +0000 (14:53 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 14 Oct 2013 18:56:45 +0000 (14:56 -0400)
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

doc/build/changelog/changelog_08.rst
lib/sqlalchemy/schema.py
test/sql/test_metadata.py

index f147fcfeda12f088e0617b1ccf68bb6926acf27a..2326d6216159359c6b5f06e378fe1b3f48f7b94d 100644 (file)
 .. 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
index 641650d32afeca9156a6890cad38dbead5366e47..bdf6bd1695538477cbb79c25ff10dd3c794670ec 100644 (file)
@@ -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(
index 3075d3685cf836e90c40abb4bdac4535a0047ac4..c4b73d1d5fa7bb95d2feff40331664a6c5f8970f 100644 (file)
@@ -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')