首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >联合加载一对多关系会导致每个子项出现重复的父项结果

联合加载一对多关系会导致每个子项出现重复的父项结果
EN

Stack Overflow用户
提问于 2018-03-22 00:40:02
回答 2查看 263关注 0票数 1

架构

代码语言:javascript
复制
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包含枚举值子集的ParentChildA对。

查询

代码语言:javascript
复制
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)。结果,我得到了太多的ParentChildA对(每个子节点B和子节点C都是额外的)。

有没有一种方法可以构建查询,使得所有子B和子C都与父级一起进入,而不需要单独的SQL语句?

同样有趣的是,与ChildA.array_of_enums相反,查询ChildA.id (或任何其他列)并不会产生“重复”的结果。

EN

回答 2

Stack Overflow用户

发布于 2018-06-10 05:02:12

已经有一段时间了,但我相信这对我很有效。联接中的后两个条件可能在筛选器中。我想我尝试过的其他方法是分离数组,在子查询中包含check,并从该子查询中进行选择,从而得到一个合理的解决方案。

代码语言:javascript
复制
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()
票数 0
EN

Stack Overflow用户

发布于 2018-06-18 20:04:36

我终于找到了一种不同的方法

我在父类中这样定义我的父子关系:

代码语言:javascript
复制
 child = relationship('Child', back_populates="parent")

我在我的Child类中这样定义我的子/父关系:

代码语言:javascript
复制
parent = relationship("Parent", back_populates="child")

我使用这个查询:

代码语言:javascript
复制
parents = session.query(Parent).outerjoin(Child,Parent.child).options(contains_eager(Parent.child)

contains_eager用于挖掘父级以查找相关子级,如下所示:

代码语言:javascript
复制
for parent in parents:
   mychilds = parent.child

所以我有我所有的父母,有或没有孩子(因为他们有很多),父母不是重复的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49411988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档