]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
added support for foreign keys to work across schemas
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 5 Jan 2006 04:00:21 +0000 (04:00 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 5 Jan 2006 04:00:21 +0000 (04:00 +0000)
lib/sqlalchemy/schema.py

index c726bd2f0f4e5b90d15fb57b13bca308675d3464..c5054cd500dda74d23166940c6f700bec148cdd2 100644 (file)
@@ -315,7 +315,8 @@ class ForeignKey(SchemaItem):
     def __init__(self, column):
         """Constructs a new ForeignKey object.  "column" can be a schema.Column
         object representing the relationship, or just its string name given as 
-        "tablename.columnname"."""
+        "tablename.columnname".  schema can be specified as 
+        "schemaname.tablename.columnname" """
         self._colspec = column
         self._column = None
 
@@ -341,11 +342,16 @@ class ForeignKey(SchemaItem):
         # be defined without dependencies
         if self._column is None:
             if isinstance(self._colspec, str):
-                m = re.match(r"([\w_-]+)(?:\.([\w_-]+))?", self._colspec)
+                m = re.match(r"^([\w_-]+)(?:\.([\w_-]+))?(?:\.([\w_-]+))?$", self._colspec)
                 if m is None:
-                    raise "Invalid foreign key column specification: " + self._colspec
-                (tname, colname) = m.group(1, 2)
-                table = Table(tname, self.parent.engine, mustexist = True)
+                    raise ValueError("Invalid foreign key column specification: " + self._colspec)
+                if m.group(3) is None:
+                    (tname, colname) = m.group(1, 2)
+                    # default to containing table's schema
+                    schema = self.parent.table.schema
+                else:
+                    (schema,tname,colname) = m.group(1,2,3)
+                table = Table(tname, self.parent.engine, mustexist=True, schema=schema)
                 if colname is None:
                     key = self.parent
                     self._column = table.c[self.parent.key]