]> 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:53:28 +0000 (14:53 -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]

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

index 38da8b9163d803d8c6907610c8b1f4492f012bd8..054227bd722709be4da0d2437d57bfaeb521819e 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 fe331ce2ee7ed4a2631a18ee8242653334192a3e..90c4fb0dd3191d5628147e3bc6e4824787c4ee3a 100644 (file)
@@ -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(
index 1da833d9f46a6f5593877dac86613328aa7c4a07..883d9308c0acf34d7a69a407de3f0289153bf415 100644 (file)
@@ -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')