From fb97a666bb6e352ae908d763d2d8ac3c087cd529 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sun, 10 Apr 2011 10:47:34 -0400 Subject: [PATCH] - Fixed bug where reflection of foreign key created as "REFERENCES " without col name would fail. [ticket:2115] (also in 0.6.7) --- CHANGES | 6 ++++++ lib/sqlalchemy/dialects/sqlite/base.py | 4 ++++ test/dialect/test_sqlite.py | 19 +++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/CHANGES b/CHANGES index 3b29f8bb69..88347f066e 100644 --- a/CHANGES +++ b/CHANGES @@ -105,6 +105,12 @@ CHANGES - The "pool.manage" feature doesn't use pickle anymore to hash the arguments for each pool. +- sqlite + - Fixed bug where reflection of foreign key + created as "REFERENCES " without + col name would fail. [ticket:2115] + (also in 0.6.7) + - postgresql - Psycopg2 for Python 3 is now supported. diff --git a/lib/sqlalchemy/dialects/sqlite/base.py b/lib/sqlalchemy/dialects/sqlite/base.py index 43d8d708ba..95f699f545 100644 --- a/lib/sqlalchemy/dialects/sqlite/base.py +++ b/lib/sqlalchemy/dialects/sqlite/base.py @@ -683,6 +683,10 @@ class SQLiteDialect(default.DefaultDialect): if row is None: break (constraint_name, rtbl, lcol, rcol) = (row[0], row[2], row[3], row[4]) + # sqlite won't return rcol if the table + # was created with REFERENCES , no col + if rcol is None: + rcol = lcol rtbl = re.sub(r'^\"|\"$', '', rtbl) lcol = re.sub(r'^\"|\"$', '', lcol) rcol = re.sub(r'^\"|\"$', '', rcol) diff --git a/test/dialect/test_sqlite.py b/test/dialect/test_sqlite.py index c50bc69c64..20e3419c42 100644 --- a/test/dialect/test_sqlite.py +++ b/test/dialect/test_sqlite.py @@ -667,3 +667,22 @@ class AutoIncrementTest(fixtures.TestBase, AssertsCompiledSQL): 'CREATE TABLE autoinctable (id INTEGER NOT ' 'NULL PRIMARY KEY AUTOINCREMENT)', dialect=sqlite.dialect()) + + +class ReflectHeadlessFKsTest(fixtures.TestBase): + def setup(self): + testing.db.execute("CREATE TABLE a (id INTEGER PRIMARY KEY)") + testing.db.execute("CREATE TABLE b (id INTEGER PRIMARY KEY REFERENCES a)") + + def teardown(self): + testing.db.execute("drop table b") + testing.db.execute("drop table a") + + def test_reflect_tables_fk_no_colref(self): + meta = MetaData() + a = Table('a', meta, autoload=True, autoload_with=testing.db) + b = Table('b', meta, autoload=True, autoload_with=testing.db) + + assert b.c.id.references(a.c.id) + + -- 2.47.2