From: Mike Bayer Date: Fri, 3 Jun 2016 19:57:16 +0000 (-0400) Subject: Ensure "options" present for unnamed / unlocatable FK X-Git-Tag: rel_1_1_0b1~23 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=061bae6e043b8c97a42f7ab28878699cdeb6b506;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Ensure "options" present for unnamed / unlocatable FK Also ensure the regular expression and subsequent matching is case insensitive, add more tests Change-Id: Ie4aa971dcbffca94e78965e22982478eccbf8597 --- diff --git a/lib/sqlalchemy/dialects/sqlite/base.py b/lib/sqlalchemy/dialects/sqlite/base.py index 7ddd099935..0f3c543859 100644 --- a/lib/sqlalchemy/dialects/sqlite/base.py +++ b/lib/sqlalchemy/dialects/sqlite/base.py @@ -1342,6 +1342,7 @@ class SQLiteDialect(default.DefaultDialect): 'referred_schema': schema, 'referred_table': rtbl, 'referred_columns': [], + 'options': {} } fks[numerical_id] = fk @@ -1378,7 +1379,6 @@ class SQLiteDialect(default.DefaultDialect): '((?:ON (?:DELETE|UPDATE) ' '(?:SET NULL|SET DEFAULT|CASCADE|RESTRICT|NO ACTION) *)*)' ) - for match in re.finditer(FK_PATTERN, table_data, re.I): ( constraint_name, constrained_columns, @@ -1394,7 +1394,7 @@ class SQLiteDialect(default.DefaultDialect): self._find_cols_in_sig(referred_columns)) referred_name = referred_quoted_name or referred_name options = {} - for token in re.split(r" *ON *", onupdatedelete): + for token in re.split(r" *ON *", onupdatedelete.upper()): if token.startswith("DELETE"): options['ondelete'] = token[6:].strip() elif token.startswith("UPDATE"): diff --git a/test/dialect/test_sqlite.py b/test/dialect/test_sqlite.py index 16a6287774..354558ebe8 100644 --- a/test/dialect/test_sqlite.py +++ b/test/dialect/test_sqlite.py @@ -1170,7 +1170,10 @@ class ConstraintReflectionTest(fixtures.TestBase): for name in [ "m", "main.l", "k", "j", "i", "h", "g", "f", "e", "e1", "d", "d1", "d2", "c", "b", "a1", "a2"]: - conn.execute("drop table %s" % name) + try: + conn.execute("drop table %s" % name) + except: + pass def test_legacy_quoted_identifiers_unit(self): dialect = sqlite.dialect() @@ -1203,7 +1206,8 @@ class ConstraintReflectionTest(fixtures.TestBase): 'referred_columns': ['id'], 'referred_schema': None, 'name': None, - 'constrained_columns': ['tid'] + 'constrained_columns': ['tid'], + 'options': {} }]) def test_foreign_key_name_is_none(self): @@ -1215,10 +1219,12 @@ class ConstraintReflectionTest(fixtures.TestBase): [ {'referred_table': 'a1', 'referred_columns': ['id'], 'referred_schema': None, 'name': None, - 'constrained_columns': ['id']}, + 'constrained_columns': ['id'], + 'options': {}}, {'referred_table': 'a2', 'referred_columns': ['id'], 'referred_schema': None, 'name': None, - 'constrained_columns': ['id']}, + 'constrained_columns': ['id'], + 'options': {}}, ] ) @@ -1231,11 +1237,13 @@ class ConstraintReflectionTest(fixtures.TestBase): { 'referred_table': 'a1', 'referred_columns': ['id'], 'referred_schema': None, 'name': 'foo1', - 'constrained_columns': ['id']}, + 'constrained_columns': ['id'], + 'options': {}}, { 'referred_table': 'a2', 'referred_columns': ['id'], 'referred_schema': None, 'name': 'foo2', - 'constrained_columns': ['id']}, + 'constrained_columns': ['id'], + 'options': {}}, ] ) @@ -1247,7 +1255,8 @@ class ConstraintReflectionTest(fixtures.TestBase): [{ 'referred_table': 'a2', 'referred_columns': ['id'], 'referred_schema': None, - 'name': None, 'constrained_columns': ['x'] + 'name': None, 'constrained_columns': ['x'], + 'options': {} }] ) @@ -1260,6 +1269,7 @@ class ConstraintReflectionTest(fixtures.TestBase): 'referred_table': 'a2', 'referred_columns': ['some ( STUPID n,ame'], 'referred_schema': None, + 'options': {}, 'name': None, 'constrained_columns': ['some ( STUPID n,ame'] }] ) @@ -1270,6 +1280,7 @@ class ConstraintReflectionTest(fixtures.TestBase): 'referred_table': 'a2', 'referred_columns': ['some ( STUPID n,ame'], 'referred_schema': None, + 'options': {}, 'name': None, 'constrained_columns': ['some ( STUPID n,ame'] }] ) @@ -1283,14 +1294,17 @@ class ConstraintReflectionTest(fixtures.TestBase): 'referred_table': 'i', 'referred_columns': ['x', 'y'], 'referred_schema': None, 'name': None, - 'constrained_columns': ['q', 'p']}] + 'constrained_columns': ['q', 'p'], + 'options': {}}] ) fks = inspector.get_foreign_keys('k') eq_( fks, - [{'referred_table': 'i', 'referred_columns': ['x', 'y'], - 'referred_schema': None, 'name': 'my_fk', - 'constrained_columns': ['q', 'p']}] + [ + {'referred_table': 'i', 'referred_columns': ['x', 'y'], + 'referred_schema': None, 'name': 'my_fk', + 'constrained_columns': ['q', 'p'], + 'options': {}}] ) def test_foreign_key_ondelete_onupdate(self): @@ -1320,6 +1334,24 @@ class ConstraintReflectionTest(fixtures.TestBase): ] ) + def test_foreign_key_options_unnamed_inline(self): + with testing.db.connect() as conn: + conn.execute( + "create table foo (id integer, " + "foreign key (id) references bar (id) on update cascade)") + + insp = inspect(conn) + eq_( + insp.get_foreign_keys('foo'), + [{ + 'name': None, + 'referred_columns': ['id'], + 'referred_table': 'bar', + 'constrained_columns': ['id'], + 'referred_schema': None, + 'options': {'onupdate': 'CASCADE'}}] + ) + def test_dont_reflect_autoindex(self): inspector = Inspector(testing.db) eq_(inspector.get_indexes('o'), [])