summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/sqlalchemy/sql/util.py11
-rw-r--r--test/ext/test_declarative_reflection.py26
2 files changed, 36 insertions, 1 deletions
diff --git a/lib/sqlalchemy/sql/util.py b/lib/sqlalchemy/sql/util.py
index cb8359048..c486f5cc1 100644
--- a/lib/sqlalchemy/sql/util.py
+++ b/lib/sqlalchemy/sql/util.py
@@ -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:
diff --git a/test/ext/test_declarative_reflection.py b/test/ext/test_declarative_reflection.py
index 38dd7cec3..a5f0df2b3 100644
--- a/test/ext/test_declarative_reflection.py
+++ b/test/ext/test_declarative_reflection.py
@@ -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