SQLAlchemy查询父级的多个子级返回[(bool,bool)]

时间:2018-08-09 15:38:32

标签: python sqlalchemy

请考虑以下SQLAlchemy数据模型:

class Parent:
    @declared_attr
    def child_A_id(cls):
        return Column(ForeignKey(Child.id), nullable=True)

    @declared_attr
    def child_B_id(cls):
        return Column(ForeignKey(Unit.id), nullable=True)

    @declared_attr
    def child_A(cls):
        return relationship(Child, primaryjoin=lambda: cls.child_A_id == Child.id)

    @declared_attr
    def child_B(cls):
        return relationship(Child, primaryjoin=lambda: cls.child_A_id == Child.id)

我正在尝试使用以下查询来同时查询child_Achild_B对象:

session.query(Parent.child_A, Parent.child_B).limit(1).all()

仅返回布尔值而不是对象(例如[(False, False)]而不是[{child_A_columns}, {child_B_columns}]

我查看了SQLAlchemy column-properties and relationships return booleans,它为一个child解决了这个问题,但无法弄清楚如何将其应用于一个Parent具有两个child关系的情况到同一张桌子。


尝试的解决方案:

parent = session.query(Parent).limit(1).all()
parent.child_A
parent.child_B

可以,但是我需要避免使用SELECT *

session.query(Parent.child_A, Parent.child_B).with_entity(Child).limit(1).all()

仅返回一个Child

1 个答案:

答案 0 :(得分:0)

question and answer you linked to解释了为什么查询会导致2元组的布尔值,但是为了查询两个孩子(根据描述)都来自同一张表,您需要aliases:< / p>

child_a = aliased(Child)
child_b = aliased(Child)

session.query(child_a, child_b).\
    select_from(Parent).\
    join(child_a, Parent.child_A).\
    join(child_b, Parent.child_B)

如果您想使用Query.with_entities(),则仍然必须先准备联接:

session.query(Parent).\
    join(child_a, Parent.child_A).\
    join(child_b, Parent.child_B).\
    with_entities(child_a, child_b)

另一方面,您可以在单个查询中为父母和他们的孩子加载:

session.query(Parent).\
    options(joinedload(Parent.child_A),
            joinedload(Parent.child_B))