请考虑以下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_A
和child_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
。
答案 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))