diff options
Diffstat (limited to 'lib/sqlalchemy/schema.py')
| -rw-r--r-- | lib/sqlalchemy/schema.py | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/lib/sqlalchemy/schema.py b/lib/sqlalchemy/schema.py index fd99d2de7..47c01024c 100644 --- a/lib/sqlalchemy/schema.py +++ b/lib/sqlalchemy/schema.py @@ -881,17 +881,33 @@ class ForeignKey(SchemaItem): raise exc.ArgumentError( "Parent column '%s' does not descend from a " "table-attached Column" % str(self.parent)) - m = re.match(r"^(.+?)(?:\.(.+?))?(?:\.(.+?))?$", self._colspec, - re.UNICODE) + + m = self._colspec.split('.') + if m is None: raise exc.ArgumentError( "Invalid foreign key column specification: %s" % self._colspec) - if m.group(3) is None: - (tname, colname) = m.group(1, 2) - schema = None + + # A FK between column 'bar' and table 'foo' can be + # specified as 'foo', 'foo.bar', 'dbo.foo.bar', + # 'otherdb.dbo.foo.bar'. Once we have the column name and + # the table name, treat everything else as the schema + # name. Some databases (e.g. Sybase) support + # inter-database foreign keys. See tickets#1341 and -- + # indirectly related -- Ticket #594. This assumes that '.' + # will never appear *within* any component of the FK. + + (schema, tname, colname) = (None, None, None) + if (len(m) == 1): + tname = m.pop() else: - (schema, tname, colname) = m.group(1, 2, 3) + colname = m.pop() + tname = m.pop() + + if (len(m) > 0): + schema = '.'.join(m) + if _get_table_key(tname, schema) not in parenttable.metadata: raise exc.NoReferencedTableError( "Could not find table '%s' with which to generate a " |
