- changed status to resolved
contains_eager() doesn't take query._polymorphic_adapters into account when no alias passed.
Issue #1543
resolved
This occurs when a class relates to the subclass of a joined table inheritance hierarchy. The contains_eager()
below will fail to properly locate the selectable generated by query.join(Parent.children)
, since query.join()
will wrap the join of "base join sub" in a subquery.
from sqlalchemy import *
from sqlalchemy.orm import *
engine = create_engine('sqlite://')
metadata = Metadata()
parent = Table('parent', metadata,
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('data', String(10)),
)
base = Table('base', metadata,
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('type', String(10)),
)
sub = Table('sub', metadata,
Column('id', Integer, ForeignKey('base.id'), primary_key=True),
Column('data', String(10)),
Column('parent_id', Integer, ForeignKey('parent.id'), nullable=False)
)
metadata.create_all(engine)
class Parent(_base.ComparableEntity):
pass
class Base(_base.ComparableEntity):
pass
class Sub(Base):
pass
mapper(Parent, parent, properties={
'children':relation(Sub)
})
mapper(Base, base, polymorphic_on=base.c.type, polymorphic_identity='b')
mapper(Sub, sub, inherits=Base, polymorphic_identity='s')
sess = create_session(bind=engine)
p1 = Parent(data='p1', children=[Sub(data='s2'), Sub(data='s3')](Sub(data='s1'),))
p2 = Parent(data='p2', children=[Sub(data='s5')](Sub(data='s4'),))
sess.add(p1)
sess.add(p2)
sess.flush()
sess.query(Parent).join(Parent.children).options(contains_eager(Parent.children)).all()
Comments (2)
-
reporter -
reporter - removed milestone
Removing milestone: 0.5.7 (automated comment)
- Log in to comment
998183be6bb4575b1088b495b9078a6f3f91293f 72d9a6ff607dc98c3a0c0c8f9ce3b4e66d4b1180