]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- The Column.references() method now returns True
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 18 Feb 2011 01:27:35 +0000 (20:27 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 18 Feb 2011 01:27:35 +0000 (20:27 -0500)
if it has a foreign key referencing the
given column exactly, not just it's parent
table.  [ticket:2064]

CHANGES
lib/sqlalchemy/schema.py
test/sql/test_metadata.py

diff --git a/CHANGES b/CHANGES
index 718677afc706efa922ca7a3f5e8e468f08e10f18..3d834b330d17ab3f1a5257fe06712b6bfa3c184e 100644 (file)
--- 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
index 40d7de94500ef01f195f728604fd6537f2254161..e6b970291cbb5ab2062b8c691b30d625a8add51a 100644 (file)
@@ -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
index 38788330ab3e3e3ca4e4130b4a6d8b3a1097c2c9..ace3b69d5a3060a84ddfca6795d1d34cff9339b6 100644 (file)
@@ -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."""