]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
fixed reflection of foreign keys to autoload the referenced table
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 22 Jul 2006 06:21:58 +0000 (06:21 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 22 Jul 2006 06:21:58 +0000 (06:21 +0000)
if it was not loaded already, affected postgres, mysql, oracle.
fixes the latest in [ticket:105]

CHANGES
lib/sqlalchemy/databases/information_schema.py
lib/sqlalchemy/databases/mysql.py
lib/sqlalchemy/databases/oracle.py
test/engine/reflection.py

diff --git a/CHANGES b/CHANGES
index 8e03c8eec4525ae1b3069c14bb46752f8ab948dc..a347df98da202d15fd1e6c23d9e45104572c08be 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -3,6 +3,8 @@
 by not raising an error when redundant mappers were set up, fixed
 - added allow_null_pks option to Mapper, allows rows where some
 primary key columns are null (i.e. when mapping to outer joins etc)
+- fixed reflection of foreign keys to autoload the referenced table
+if it was not loaded already
 
 0.2.6
 - big overhaul to schema to allow truly composite primary and foreign
index 296db2de5779cfe268c12d5822c42aba8fda7417..291637e9e5590da9da51246f61d6ecc2c2a09d49 100644 (file)
@@ -185,8 +185,10 @@ def reflecttable(connection, table, ischema_names):
             if current_schema == referred_schema:
                 referred_schema = table.schema
             if referred_schema is not None:
+                schema.Table(referred_table, table.metadata, autoload=True, schema=referred_schema, autoload_with=connection)
                 refspec = ".".join([referred_schema, referred_table, referred_column])
             else:
+                schema.Table(referred_table, table.metadata, autoload=True, autoload_with=connection)
                 refspec = ".".join([referred_table, referred_column])
             if constrained_column not in fk[0]:
                 fk[0].append(constrained_column)
index 1d587ff7c511b97b1e16ecc82e4afbe26f845163..3f3e8d14847603752a5a529112a2db97e1b81940 100644 (file)
@@ -370,6 +370,7 @@ class MySQLDialect(ansisql.ANSIDialect):
         for match in re.finditer(fkpat, desc):
             columns = re.findall(r'`(.+?)`', match.group('columns'))
             refcols = [match.group('reftable') + "." + x for x in re.findall(r'`(.+?)`', match.group('refcols'))]
+            schema.Table(match.group('reftable'), table.metadata, autoload=True, autoload_with=connection)
             constraint = schema.ForeignKeyConstraint(columns, refcols, name=match.group('name'))
             table.append_item(constraint)
 
index 04950674aede35a462071bb44db8fcb78063ffd9..c279da619f0d768e865151b6bed8e1c1873839d2 100644 (file)
@@ -237,6 +237,7 @@ class OracleDialect(ansisql.ANSIDialect):
                    fk = ([], [])
                    fks[cons_name] = fk
                 refspec = ".".join([remote_table, remote_column])
+                schema.Table(remote_table, table.metadata, autoload=True, autoload_with=connection)
                 if local_column not in fk[0]:
                     fk[0].append(local_column)
                 if refspec not in fk[1]:
index 582920b304d20d30d897e5a8870568e12f4db9fe..7cb31fd77a37ba39a8deb3108f5dac27e2aef00a 100644 (file)
@@ -64,12 +64,14 @@ class ReflectionTest(PersistTest):
         addresses.create()
 
         # clear out table registry
-        users.deregister()
-        addresses.deregister()
+        meta.clear()
 
         try:
-            users = Table('engine_users', testbase.db, autoload = True)
-            addresses = Table('engine_email_addresses', testbase.db, autoload = True)
+            addresses = Table('engine_email_addresses', meta, autoload = True)
+            # reference the addresses foreign key col, which will require users to be 
+            # reflected at some point
+            print addresses.c.remote_user_id.foreign_key.column
+            users = Table('engine_users', meta, autoload = True)
         finally:
             addresses.drop()
             users.drop()