]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
ignore columns that don't resolve here either.
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 19 May 2012 23:33:58 +0000 (19:33 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 19 May 2012 23:33:58 +0000 (19:33 -0400)
lib/sqlalchemy/sql/util.py
test/ext/test_declarative_reflection.py

index cb8359048bf1a626bf154cdf9548391d84611af7..c486f5cc11a9127bd38566ed4406cffb43969c3f 100644 (file)
@@ -575,7 +575,7 @@ def reduce_columns(columns, *clauses, **kw):
     to further identify columns that are "equivalent".
 
     \**kw may specify 'ignore_nonexistent_tables' to ignore foreign keys
-    whose tables are not yet configured.
+    whose tables are not yet configured, or columns that aren't yet present.
 
     This function is primarily used to determine the most minimal "primary key"
     from a selectable, by reducing the set of primary key columns present
@@ -594,7 +594,16 @@ def reduce_columns(columns, *clauses, **kw):
                     continue
                 try:
                     fk_col = fk.column
+                except exc.NoReferencedColumnError:
+                    # TODO: add specific coverage here
+                    # to test/sql/test_selectable ReduceTest
+                    if ignore_nonexistent_tables:
+                        continue
+                    else:
+                        raise
                 except exc.NoReferencedTableError:
+                    # TODO: add specific coverage here
+                    # to test/sql/test_selectable ReduceTest
                     if ignore_nonexistent_tables:
                         continue
                     else:
index 38dd7cec3abf4c7ef595a22e8c9276c254c612e6..a5f0df2b3cac80c37e8086b1163ed1eb63730ccc 100644 (file)
@@ -153,6 +153,32 @@ class DeferredReflectBase(DeclarativeReflectionBase):
         from sqlalchemy.ext.declarative import _MapperConfig
         _MapperConfig.configs.clear()
 
+class DeferredReflectPKFKTest(DeferredReflectBase):
+    @classmethod
+    def define_tables(cls, metadata):
+        Table("a", metadata,
+            Column('id', Integer,
+                primary_key=True, test_needs_autoincrement=True),
+        )
+        Table("b", metadata, 
+            Column('id', Integer,
+                ForeignKey('a.id'),
+                primary_key=True),
+            Column('x', Integer, primary_key=True)
+        )
+
+    def test_pk_fk(self):
+        class B(decl.DeferredReflection, fixtures.ComparableEntity, 
+                            Base):
+            __tablename__ = 'b'
+            a = relationship("A")
+
+        class A(decl.DeferredReflection, fixtures.ComparableEntity, 
+                            Base):
+            __tablename__ = 'a'
+
+        decl.DeferredReflection.prepare(testing.db)
+
 class DeferredReflectionTest(DeferredReflectBase):
 
     @classmethod