summaryrefslogtreecommitdiff
path: root/test/orm/inheritance/test_basic.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2011-05-07 12:52:25 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2011-05-07 12:52:25 -0400
commit4bc2402cc0bc585af1d0e7d59000f73cf20cf452 (patch)
treebc753ce330385f31c870ad5ecc4230e899967599 /test/orm/inheritance/test_basic.py
parent7adcb1c7443265fc99d05714c964c795f0fe1c13 (diff)
downloadsqlalchemy-4bc2402cc0bc585af1d0e7d59000f73cf20cf452.tar.gz
- Changed the handling in determination of join
conditions such that foreign key errors are only considered between the two given tables. That is, t1.join(t2) will report FK errors that involve 't1' or 't2', but anything involving 't3' will be skipped. This affects join(), as well as ORM relationship and inherit condition logic. Will keep the more conservative approach to [ticket:2153] in 0.6.
Diffstat (limited to 'test/orm/inheritance/test_basic.py')
-rw-r--r--test/orm/inheritance/test_basic.py76
1 files changed, 63 insertions, 13 deletions
diff --git a/test/orm/inheritance/test_basic.py b/test/orm/inheritance/test_basic.py
index 5b0deaf9d..ee408373a 100644
--- a/test/orm/inheritance/test_basic.py
+++ b/test/orm/inheritance/test_basic.py
@@ -1508,7 +1508,7 @@ class NoPKOnSubTableWarningTest(fixtures.TestBase):
eq_(mc.primary_key, (parent.c.id,))
class InhCondTest(fixtures.TestBase):
- def test_inh_cond_ignores_others(self):
+ def test_inh_cond_nonexistent_table_unrelated(self):
metadata = MetaData()
base_table = Table("base", metadata,
Column("id", Integer, primary_key=True)
@@ -1532,7 +1532,32 @@ class InhCondTest(fixtures.TestBase):
base_table.c.id==derived_table.c.id
)
- def test_inh_cond_fails_notfound(self):
+ def test_inh_cond_nonexistent_col_unrelated(self):
+ m = MetaData()
+ base_table = Table("base", m,
+ Column("id", Integer, primary_key=True)
+ )
+ derived_table = Table("derived", m,
+ Column("id", Integer, ForeignKey('base.id'),
+ primary_key=True),
+ Column('order_id', Integer, ForeignKey('order.foo'))
+ )
+ order_table = Table('order', m, Column('id', Integer, primary_key=True))
+ class Base(object):
+ pass
+
+ class Derived(Base):
+ pass
+
+ mapper(Base, base_table)
+
+ # succeeds, despite "order.foo" doesn't exist
+ m2 = mapper(Derived, derived_table, inherits=Base)
+ assert m2.inherit_condition.compare(
+ base_table.c.id==derived_table.c.id
+ )
+
+ def test_inh_cond_no_fk(self):
metadata = MetaData()
base_table = Table("base", metadata,
Column("id", Integer, primary_key=True)
@@ -1556,7 +1581,7 @@ class InhCondTest(fixtures.TestBase):
Derived, derived_table, inherits=Base
)
- def test_inh_cond_fails_separate_metas(self):
+ def test_inh_cond_nonexistent_table_related(self):
m1 = MetaData()
m2 = MetaData()
base_table = Table("base", m1,
@@ -1575,21 +1600,46 @@ class InhCondTest(fixtures.TestBase):
mapper(Base, base_table)
- # this used to be "can't resolve foreign key base.id",
- # but with the flag on, we just get "can't find". this is
- # the less-than-ideal case that prevented us from doing this
- # for mapper(), not just declarative, in the first place.
- # there is no case where the failure would be silent -
- # there is either a single join condition between the two tables
- # or there's not.
+ # the ForeignKey def is correct but there are two
+ # different metadatas. Would like the traditional
+ # "noreferencedtable" error to raise so that the
+ # user is directed towards the FK definition in question.
assert_raises_message(
- sa_exc.ArgumentError,
- "Can't find any foreign key relationships between "
- "'base' and 'derived'.",
+ sa_exc.NoReferencedTableError,
+ "Foreign key associated with column 'derived.id' "
+ "could not find table 'base' with which to generate "
+ "a foreign key to target column 'id'",
mapper,
Derived, derived_table, inherits=Base
)
+ def test_inh_cond_nonexistent_col_related(self):
+ m = MetaData()
+ base_table = Table("base", m,
+ Column("id", Integer, primary_key=True)
+ )
+ derived_table = Table("derived", m,
+ Column("id", Integer, ForeignKey('base.q'),
+ primary_key=True),
+ )
+
+ class Base(object):
+ pass
+
+ class Derived(Base):
+ pass
+
+ mapper(Base, base_table)
+
+ assert_raises_message(
+ sa_exc.NoReferencedColumnError,
+ "Could not create ForeignKey 'base.q' on table "
+ "'derived': table 'base' has no column named 'q'",
+ mapper,
+ Derived, derived_table, inherits=Base
+ )
+
+
class PKDiscriminatorTest(fixtures.MappedTest):
@classmethod
def define_tables(cls, metadata):