diff options
-rw-r--r-- | lib/sqlalchemy/sql/util.py | 11 | ||||
-rw-r--r-- | test/ext/test_declarative_reflection.py | 26 |
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 |