From: Mike Bayer Date: Fri, 18 Feb 2011 01:27:35 +0000 (-0500) Subject: - The Column.references() method now returns True X-Git-Tag: rel_0_7b2~1^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=01cb94690d2d07431b2ff1b02577345c003be42b;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - The Column.references() method now returns True if it has a foreign key referencing the given column exactly, not just it's parent table. [ticket:2064] --- diff --git a/CHANGES b/CHANGES index 718677afc7..3d834b330d 100644 --- a/CHANGES +++ b/CHANGES @@ -29,6 +29,11 @@ CHANGES metadata.create_all() and metadata.drop_all(), including "checkfirst" logic. [ticket:2055] + - The Column.references() method now returns True + if it has a foreign key referencing the + given column exactly, not just it's parent + table. [ticket:2064] + - ext - Association proxy now has correct behavior for any(), has(), and contains() when proxying diff --git a/lib/sqlalchemy/schema.py b/lib/sqlalchemy/schema.py index 40d7de9450..e6b970291c 100644 --- a/lib/sqlalchemy/schema.py +++ b/lib/sqlalchemy/schema.py @@ -766,7 +766,7 @@ class Column(SchemaItem, expression.ColumnClause): key.""" for fk in self.foreign_keys: - if fk.references(column.table): + if fk.column.proxy_set.intersection(column.proxy_set): return True else: return False diff --git a/test/sql/test_metadata.py b/test/sql/test_metadata.py index 38788330ab..ace3b69d5a 100644 --- a/test/sql/test_metadata.py +++ b/test/sql/test_metadata.py @@ -500,6 +500,52 @@ class TableTest(TestBase, AssertsCompiledSQL): assign ) +class ConstraintTest(TestBase): + def _single_fixture(self): + m = MetaData() + + t1 = Table('t1', m, + Column('a', Integer), + Column('b', Integer) + ) + + t2 = Table('t2', m, + Column('a', Integer, ForeignKey('t1.a')) + ) + + t3 = Table('t3', m, + Column('a', Integer) + ) + return t1, t2, t3 + + def test_table_references(self): + t1, t2, t3 = self._single_fixture() + assert list(t2.c.a.foreign_keys)[0].references(t1) + assert not list(t2.c.a.foreign_keys)[0].references(t3) + + def test_column_references(self): + t1, t2, t3 = self._single_fixture() + assert t2.c.a.references(t1.c.a) + assert not t2.c.a.references(t3.c.a) + assert not t2.c.a.references(t1.c.b) + + def test_column_references_derived(self): + t1, t2, t3 = self._single_fixture() + s1 = tsa.select([tsa.select([t1]).alias()]) + assert t2.c.a.references(s1.c.a) + assert not t2.c.a.references(s1.c.b) + + def test_copy_doesnt_reference(self): + t1, t2, t3 = self._single_fixture() + a2 = t2.c.a.copy() + assert not a2.references(t1.c.a) + assert not a2.references(t1.c.b) + + def test_derived_column_references(self): + t1, t2, t3 = self._single_fixture() + s1 = tsa.select([tsa.select([t2]).alias()]) + assert s1.c.a.references(t1.c.a) + assert not s1.c.a.references(t1.c.b) class ColumnDefinitionTest(TestBase): """Test Column() construction."""