模式

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

目标
查询ParentChildA对,其中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)。结果,我得到了太多的ParentChildA对(额外为每个儿童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()

08-05 05:48