summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2016-06-03 15:57:16 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2016-06-03 15:57:16 -0400
commit061bae6e043b8c97a42f7ab28878699cdeb6b506 (patch)
tree599db030f8c85893c4011cf769f8212428a22bc9
parentdaf209bd6b6fe94cbec162cef2a53c49e9f31cde (diff)
downloadsqlalchemy-061bae6e043b8c97a42f7ab28878699cdeb6b506.tar.gz
Ensure "options" present for unnamed / unlocatable FK
Also ensure the regular expression and subsequent matching is case insensitive, add more tests Change-Id: Ie4aa971dcbffca94e78965e22982478eccbf8597
-rw-r--r--lib/sqlalchemy/dialects/sqlite/base.py4
-rw-r--r--test/dialect/test_sqlite.py54
2 files changed, 45 insertions, 13 deletions
diff --git a/lib/sqlalchemy/dialects/sqlite/base.py b/lib/sqlalchemy/dialects/sqlite/base.py
index 7ddd09993..0f3c54385 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 16a628777..354558ebe 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'), [])