]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
sqlite/postgres reflection will properly add foreign keys
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 8 Jan 2006 18:11:52 +0000 (18:11 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 8 Jan 2006 18:11:52 +0000 (18:11 +0000)
added append_item() method to column to work similarly to table.append_item(), used to
append foreign keys to the column (required in mysql)
appending new foreign keys will properly replace the old one, so explicitly appending
foreign keys to tables will replace those loaded via table reflection (instead of doubling them up)

lib/sqlalchemy/databases/information_schema.py
lib/sqlalchemy/databases/sqlite.py
lib/sqlalchemy/schema.py
test/engines.py

index fdd705ed2efe87d2c49a0b5ae01c530e28114aed..dae3af2c697a0b200349de59da57a78ec9f313cd 100644 (file)
@@ -130,4 +130,5 @@ def reflecttable(engine, table, ischema_names, use_mysql=False):
             table.c[constrained_column]._set_primary_key()
         elif type=='FOREIGN KEY':
             remotetable = Table(referred_table, engine, autoload = True, schema=referred_schema)
-            table.c[constrained_column].foreign_key = schema.ForeignKey(remotetable.c[referred_column])
+            table.c[constrained_column].append_item(schema.ForeignKey(remotetable.c[referred_column]))
+            
index 3c15d48b5f34110bb2dfb71778dcb4d2912a9d70..49630b9ed3b1034d4a45bfc41670db43f9c9e22c 100644 (file)
@@ -150,7 +150,7 @@ class SQLiteSQLEngine(ansisql.ANSISQLEngine):
             (tablename, localcol, remotecol) = (row[2], row[3], row[4])
             #print "row! " + repr(row)
             remotetable = Table(tablename, self, autoload = True)
-            table.c[localcol].foreign_key = schema.ForeignKey(remotetable.c[remotecol])
+            table.c[localcol].append_item(schema.ForeignKey(remotetable.c[remotecol]))
         # check for UNIQUE indexes
         c = self.execute("PRAGMA index_list(" + table.name + ")", {})
         unique_indexes = []
index 1d5b504e2efd9dd2dec3c530d8a4194c3e1702e4..026825737e1734551440bc3680c250720184b8c7 100644 (file)
@@ -238,6 +238,9 @@ class Column(SchemaItem):
     original = property(lambda s: s._orig or s)
     engine = property(lambda s: s.table.engine)
     
+    def append_item(self, item):
+        self._init_items(item)
+        
     def _set_primary_key(self):
         if self.primary_key:
             return
@@ -374,6 +377,10 @@ class ForeignKey(SchemaItem):
         
     def _set_parent(self, column):
         self.parent = column
+        # if a foreign key was already set up for this, replace it with 
+        # this one, including removing from the parent
+        if self.parent.foreign_key is not None:
+            self.parent.table.foreign_keys.remove(self.parent.foreign_key)
         self.parent.foreign_key = self
         self.parent.table.foreign_keys.append(self)
 
index 0ab3cb3e6593a0a060651ee083af4f444ec974dd..8a0bc2458346abde5e02fed3e316c089dfacbc07 100644 (file)
@@ -53,9 +53,16 @@ class EngineTest(PersistTest):
 
         users.create()
         addresses.create()
-
-        addresses.drop()
-        users.drop()
+        try:
+            # create a join from the two tables, this insures that
+            # theres a foreign key set up
+#            addresses.c.remote_user_id.append_item(ForeignKey('engine_users.user_id'))
+            j = join(users, addresses)
+            print str(j.onclause)
+            self.assert_((users.c.user_id==addresses.c.remote_user_id).compare(j.onclause))
+        finally:
+            addresses.drop()
+            users.drop()
 
     def testmultipk(self):
         table = Table(