From: Mike Bayer Date: Sun, 8 Jul 2007 21:18:46 +0000 (+0000) Subject: - ForeignKey to a table in a schema thats not the default schema X-Git-Tag: rel_0_3_9~37 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=af611b101842ee9482ddd901762fd73a6fe62364;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - ForeignKey to a table in a schema thats not the default schema requires the schema to be explicit; i.e. ForeignKey('alt_schema.users.id') - the fix in "schema" above fixes postgres reflection of foreign keys from an alt-schema table to a public schema table --- diff --git a/CHANGES b/CHANGES index 3f486511d1..5aa8734340 100644 --- a/CHANGES +++ b/CHANGES @@ -31,6 +31,8 @@ trip over synonyms (and others) that are named after the column's actual "key" (since, column_prefix means "dont use the key"). - sql + - ForeignKey to a table in a schema thats not the default schema + requires the schema to be explicit; i.e. ForeignKey('alt_schema.users.id') - MetaData can now be constructed with an engine or url as the first argument, just like BoundMetaData - BoundMetaData is now deprecated, and MetaData is a direct substitute. @@ -82,6 +84,8 @@ - added support for reflection of domains [ticket:570] - types which are missing during reflection resolve to Null type instead of raising an error + - the fix in "schema" above fixes reflection of foreign keys from an + alt-schema table to a public schema table - sqlite - sqlite better handles datetime/date/time objects mixed and matched with various Date/Time/DateTime columns diff --git a/lib/sqlalchemy/schema.py b/lib/sqlalchemy/schema.py index d01677b697..eb7eb8c1d9 100644 --- a/lib/sqlalchemy/schema.py +++ b/lib/sqlalchemy/schema.py @@ -701,7 +701,7 @@ class ForeignKey(SchemaItem): raise exceptions.ArgumentError("Invalid foreign key column specification: " + self._colspec) if m.group(3) is None: (tname, colname) = m.group(1, 2) - schema = parenttable.schema + schema = None else: (schema,tname,colname) = m.group(1,2,3) table = Table(tname, parenttable.metadata, mustexist=True, schema=schema) diff --git a/test/dialect/postgres.py b/test/dialect/postgres.py index 8a69f24536..8d62625c9a 100644 --- a/test/dialect/postgres.py +++ b/test/dialect/postgres.py @@ -120,6 +120,50 @@ class MiscTest(AssertMixin): finally: meta1.drop_all() + @testbase.supported('postgres') + def test_schema_reflection_2(self): + meta1 = MetaData(testbase.db) + subject = Table("subject", meta1, + Column("id", Integer, primary_key=True), + ) + + referer = Table("referer", meta1, + Column("id", Integer, primary_key=True), + Column("ref", Integer, ForeignKey('subject.id')), + schema="alt_schema") + meta1.create_all() + try: + meta2 = MetaData(testbase.db) + subject = Table("subject", meta2, autoload=True) + referer = Table("referer", meta2, schema="alt_schema", autoload=True) + print str(subject.join(referer).onclause) + self.assert_((subject.c.id==referer.c.ref).compare(subject.join(referer).onclause)) + finally: + meta1.drop_all() + + @testbase.supported('postgres') + def test_schema_reflection_3(self): + meta1 = MetaData(testbase.db) + subject = Table("subject", meta1, + Column("id", Integer, primary_key=True), + schema='alt_schema_2' + ) + + referer = Table("referer", meta1, + Column("id", Integer, primary_key=True), + Column("ref", Integer, ForeignKey('alt_schema_2.subject.id')), + schema="alt_schema") + + meta1.create_all() + try: + meta2 = MetaData(testbase.db) + subject = Table("subject", meta2, autoload=True, schema="alt_schema_2") + referer = Table("referer", meta2, schema="alt_schema", autoload=True) + print str(subject.join(referer).onclause) + self.assert_((subject.c.id==referer.c.ref).compare(subject.join(referer).onclause)) + finally: + meta1.drop_all() + @testbase.supported('postgres') def test_preexecute_passivedefault(self): """test that when we get a primary key column back