【问题标题】:How can I join two queries on a common relationship in sqlalchemy?如何在 sqlalchemy 中加入两个关于共同关系的查询?
【发布时间】:2012-11-10 17:10:17
【问题描述】:

假设我有两个类ChildAChildB,它们都与Parent 有关系。 还假设我已经定义了两个查询,qaqb,它们查询各自的子类。 我想在拥有相同的parent 时加入qbqa

如果parent 只是一个普通的列,我可以这样做:

subquery = qb.subquery()
joined_query = qa.join(subquery, AliasedChildA.parent==subquery.columns.parent)

这里,AliasedChildAChildA 的别名。 (我可以完全控制查询的创建方式,但不能控制稍后应用于它们的过滤器。) 但是现在,由于parent是一个关系,所以subquery.columns中不包含它。

如果拥有相同的parent,如何加入qaqb

【问题讨论】:

    标签: python join sqlalchemy relationship


    【解决方案1】:

    试试下面的:

    qa = session.query(ChildA)
    qb = session.query(ChildB)
    # @note: *qa* and *qb* may include other filters etc, 
    # but assuming they do not contain joins on *Parent*
    subquery = qb.subquery()
    qry = qa.join(Parent).join(subquery)
    

    【讨论】:

    • 这是个好主意。我唯一的问题是我事先不知道Parent 关系parent 被映射到哪个类。也许我应该研究如何通过内省来收集这些信息。 (也许我应该尝试解决更简单/更自然的问题......)
    • 只要每个ChildA/BParent只有一个关系,它就可以工作。否则,您应该知道您需要哪种关系来满足您的要求:..upon having the same parent
    【解决方案2】:

    试试AliasedChildA.parent_id == subquery.c.parent_idand_ 如果你有一个复合 pk 的话,几个子句)。

    【讨论】:

    • 这是我目前正在尝试的解决方法。但是,这依赖于建立在parent_id 上的关系,通常我无法控制列的名称,只能控制关系。我能以某种方式找出用于建立关系的列吗?
    • 另外,最后我想对parent1.children == parent2.children 之类的东西执行join,但我不知道该怎么做。
    • 您可以从 orm 类 (class.attribute.property.column) 中进行一些自省,但不能从子查询的起点进行。玩转嵌入式 IPython,看看你可以自省什么。
    • 您可以将 SQLAlchemy 字段作为参数直接传递给您的函数。 my_join_function(Model1.xxx, Model2.yyy) 您也可以传递字符串并使用 getattr(model, field_name)。我不建议疯狂地反省事物以找到匹配的字段名称。这似乎是代码异味。
    【解决方案3】:
    query_a.subquery().join(query_b.subquery(), $on_condition...)
    

    为我工作:)

    【讨论】:

    • $on_condition的格式是什么?可以举个例子吗?
    • @egor83 这么久忘记了,抱歉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    相关资源
    最近更新 更多