模式
class Parent:
relationship(ChildA) #One-to-Many
relationship(ChildB, lazy="joined") #One-to-Many
relationship(ChildC, lazy="joined") #One-to-Many
class ChildA:
parent_id
array_of_enums
id
class ChildB:
parent_id
class ChildC:
parent_id
目标
查询
Parent
,ChildA
对,其中ChildA.array_of_enums
包含枚举值的子集。查询
session.query(Parent, ChildA.array_of_enums).filter(
Parent.attr == specified_value,
Parent.id == ChildA.parent_id,
ChildA.array_of_enums.contains(enums)
ChildA.attr == specified_value_2
).all()
问题
SQLAlchemy为
ChildB
&ChildC
附加joinedload选项,并为ChildB
&Child C
的每个子级返回(Parent,ChildA.array_of_enum)。结果,我得到了太多的Parent
,ChildA
对(额外为每个儿童B和儿童C)。是否有方法构建查询,以便所有子B和子C都与父B和子C一起进入,而不需要单独的SQL语句?
同样有趣的是,查询
ChildA.id
(或任何其他列)而不是ChildA.array_of_enums
,不会导致“重复”的结果。 最佳答案
已经有一段时间了,但我相信这对我有效。连接中的后两个条件可能在筛选器中。我想我尝试的另一个合理的解决方案是分离数组包含签入子查询并从该子查询中进行选择。
session.query(
Parent,
Child.array_of_enums
).join(
Child, and_(
Child.parent_id == Parent.id,
Child.array_of_enums.contains(enums),
ChildA.attr == specified_value_2
)
).filter(
Parent.attr == specified_value,
).all()