架构
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目标
查询ChildA.array_of_enums包含枚举值子集的Parent、ChildA对。
查询
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附加了联合加载选项,并导致为ChildB & Child C的每个子级返回(Parent,ChildA.array_of_enums)。结果,我得到了太多的Parent,ChildA对(每个子节点B和子节点C都是额外的)。
有没有一种方法可以构建查询,使得所有子B和子C都与父级一起进入,而不需要单独的SQL语句?
同样有趣的是,与ChildA.array_of_enums相反,查询ChildA.id (或任何其他列)并不会产生“重复”的结果。
发布于 2018-06-10 05:02:12
已经有一段时间了,但我相信这对我很有效。联接中的后两个条件可能在筛选器中。我想我尝试过的其他方法是分离数组,在子查询中包含check,并从该子查询中进行选择,从而得到一个合理的解决方案。
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()发布于 2018-06-18 20:04:36
我终于找到了一种不同的方法
我在父类中这样定义我的父子关系:
child = relationship('Child', back_populates="parent")我在我的Child类中这样定义我的子/父关系:
parent = relationship("Parent", back_populates="child")我使用这个查询:
parents = session.query(Parent).outerjoin(Child,Parent.child).options(contains_eager(Parent.child)contains_eager用于挖掘父级以查找相关子级,如下所示:
for parent in parents:
mychilds = parent.child所以我有我所有的父母,有或没有孩子(因为他们有很多),父母不是重复的。
https://stackoverflow.com/questions/49411988
复制相似问题