]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed bug in SQLite dialect where reflection of UNIQUE constraints
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 21 Jul 2015 16:33:35 +0000 (12:33 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 21 Jul 2015 16:33:35 +0000 (12:33 -0400)
that included non-alphabetic characters in the names, like dots or
spaces, would not be reflected with their name.
fixes #3495

doc/build/changelog/changelog_09.rst
lib/sqlalchemy/dialects/sqlite/base.py
lib/sqlalchemy/testing/suite/test_reflection.py

index 2d2964ba4486a8c8cfd0a61c6e2b9c51b59ca4db..4f1e6093e3869267ff2b78a2276a7520df049810 100644 (file)
 .. changelog::
     :version: 0.9.10
 
+    .. change::
+        :tags: bug, sqlite
+        :tickets: 3495
+        :versions: 1.0.8
+
+        Fixed bug in SQLite dialect where reflection of UNIQUE constraints
+        that included non-alphabetic characters in the names, like dots or
+        spaces, would not be reflected with their name.
+
     .. change::
         :tags: feature, sql
         :tickets: 3418
index d9da46f4cbbdc5e0bf1ac113e5fab2ddd8bec6e8..e19047b766bf52c596da4cabbc2801777f7778dd 100644 (file)
@@ -1387,7 +1387,7 @@ class SQLiteDialect(default.DefaultDialect):
         unique_constraints = []
 
         def parse_uqs():
-            UNIQUE_PATTERN = '(?:CONSTRAINT (\w+) +)?UNIQUE *\((.+?)\)'
+            UNIQUE_PATTERN = '(?:CONSTRAINT "?(.+?)"? +)?UNIQUE *\((.+?)\)'
             INLINE_UNIQUE_PATTERN = (
                 '(?:(".+?")|([a-z0-9]+)) '
                 '+[a-z0-9_ ]+? +UNIQUE')
index 3edbdeb8c0816b0c8fd714cd9eb8b580c1b7669f..288a85973667bb508891e1cda82f7f22c365d21c 100644 (file)
@@ -531,12 +531,20 @@ class ComponentReflectionTest(fixtures.TablesTest):
 
     @testing.provide_metadata
     def _test_get_unique_constraints(self, schema=None):
+        # SQLite dialect needs to parse the names of the constraints
+        # separately from what it gets from PRAGMA index_list(), and
+        # then matches them up.  so same set of column_names in two
+        # constraints will confuse it.    Perhaps we should no longer
+        # bother with index_list() here since we have the whole
+        # CREATE TABLE?
         uniques = sorted(
             [
                 {'name': 'unique_a', 'column_names': ['a']},
                 {'name': 'unique_a_b_c', 'column_names': ['a', 'b', 'c']},
                 {'name': 'unique_c_a_b', 'column_names': ['c', 'a', 'b']},
                 {'name': 'unique_asc_key', 'column_names': ['asc', 'key']},
+                {'name': 'i.have.dots', 'column_names': ['b']},
+                {'name': 'i have spaces', 'column_names': ['c']},
             ],
             key=operator.itemgetter('name')
         )