would have no 'polymorphic_on' column if it didn't also
specify a 'polymorphic_identity', leading to strange
errors upon refresh, wrong class loaded when querying
- from that target. [ticket:2038]
+ from that target. Also emits the correct WHERE criterion
+ when using single table inheritance. [ticket:2038]
- sql
- Column.copy(), as used in table.tometadata(), copies the
@classmethod
def define_tables(cls, metadata):
Table('base', metadata,
- Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
+ Column('id', Integer, primary_key=True,
+ test_needs_autoincrement=True),
Column('type', String(50), nullable=False),
)
@classmethod
def setup_classes(cls):
- class A(_base.BasicEntity):
+ class A(_base.ComparableEntity):
pass
class B(A):
pass
class C(B):
pass
+ class D(B):
+ pass
+ class E(A):
+ pass
@classmethod
@testing.resolve_artifact_names
def setup_mappers(cls):
mapper(A, base, polymorphic_on=base.c.type)
- mapper(B, inherits=A)
+ mapper(B, inherits=A, )
mapper(C, inherits=B, polymorphic_identity='c')
+ mapper(D, inherits=B, polymorphic_identity='d')
+ mapper(E, inherits=A, polymorphic_identity='e')
@testing.resolve_artifact_names
def test_load_from_middle(self):
assert class_mapper(B).polymorphic_on is base.c.type
assert class_mapper(C).polymorphic_on is base.c.type
+ @testing.resolve_artifact_names
+ def test_load_multiple_from_middle(self):
+ s = Session()
+ s.add_all([C(), D(), E()])
+ eq_(
+ s.query(B).order_by(base.c.type).all(),
+ [C(), D()]
+ )
+
class DeleteOrphanTest(_base.MappedTest):
@classmethod
def define_tables(cls, metadata):