contains_eager() doesn't take query._polymorphic_adapters into account when no alias passed.

Issue #1543 resolved
Mike Bayer repo owner created an issue

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)

  1. Log in to comment