From 38d220c2b295538cd6a53a01bb5a455ed6444ef6 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Tue, 21 Jul 2015 12:33:35 -0400 Subject: [PATCH] - 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. fixes #3495 (cherry picked from commit f39e692d1249aeffb4de85987f6a74303fc5dcc5) Conflicts: lib/sqlalchemy/dialects/sqlite/base.py --- doc/build/changelog/changelog_09.rst | 9 +++++++++ lib/sqlalchemy/dialects/sqlite/base.py | 2 +- lib/sqlalchemy/testing/suite/test_reflection.py | 8 ++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/doc/build/changelog/changelog_09.rst b/doc/build/changelog/changelog_09.rst index 1a653af96f..cd2e073757 100644 --- a/doc/build/changelog/changelog_09.rst +++ b/doc/build/changelog/changelog_09.rst @@ -14,6 +14,15 @@ .. 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 diff --git a/lib/sqlalchemy/dialects/sqlite/base.py b/lib/sqlalchemy/dialects/sqlite/base.py index 8653d7bb82..fc36491000 100644 --- a/lib/sqlalchemy/dialects/sqlite/base.py +++ b/lib/sqlalchemy/dialects/sqlite/base.py @@ -1307,7 +1307,7 @@ class SQLiteDialect(default.DefaultDialect): c = connection.execute(UNIQUE_SQL, table_name=table_name) table_data = c.fetchone()[0] - UNIQUE_PATTERN = 'CONSTRAINT (\w+) UNIQUE \(([^\)]+)\)' + UNIQUE_PATTERN = 'CONSTRAINT "?(.+?)"? UNIQUE \(([^\)]+)\)' return [ {'name': name, 'column_names': [col.strip(' "') for col in cols.split(',')]} diff --git a/lib/sqlalchemy/testing/suite/test_reflection.py b/lib/sqlalchemy/testing/suite/test_reflection.py index 7cc5fd1605..e1e612c4d8 100644 --- a/lib/sqlalchemy/testing/suite/test_reflection.py +++ b/lib/sqlalchemy/testing/suite/test_reflection.py @@ -431,12 +431,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') ) -- 2.47.3