【问题标题】:Join query in SqlAlchemy在 SqlAlchemy 中加入查询
【发布时间】:2018-12-06 02:26:42
【问题描述】:

我在 MySQL 中有这个查询:

SELECT
    O.id,
    O.label,
    A.name
FROM
    organizations O
JOIN activities_area A JOIN assoc_organization_activities S ON
    O.identifier = S.organization_id AND A.identifier = S.activities_area_id
ORDER BY
    O.label

我正在尝试使用 SQLAlchemy:

A = aliased(model.Activities, name='A')
S = aliased(model.AssocOrganizationsActivities, name='S')
O = aliased(model.Organizations, name='O')

organizations_query = session.query(O.id, O.label, A.name) \
                             .join(A) \
                             .join(S) \
                             .filter(O.identifier == S.organization_id) \
                             .filter(A.identifier == S.activities_area_id) \
                             .order_by(O.label) \
                             .all()

但这给了我这个错误:

InvalidRequestError: Could not find a FROM clause to join from. Tried joining to <class 'model.model.Activities'>, but got: Can't find any foreign key relationships between 'organizations' and 'activities_area'.

AssocOrganizationsActivities 表只有 3 个字段:id、作为外键的组织 id 和作为外键的活动区域 id。因此,表组织和活动都由 AssocOrganizationsActivities 链接。

如何让它发挥作用?

【问题讨论】:

    标签: python mysql sql join sqlalchemy


    【解决方案1】:

    交换连接的顺序。您的原始 SQL 和查询都受到相同的影响,因此:

    organizations_query = session.query(O.id, ...) \    
        .join(S) \
        .join(A) \
        ...
    

    您要添加的 WHERE 子句

    ...
        .filter(O.identifier == S.organization_id) \
        .filter(A.identifier == S.activities_area_id) \
        ...
    

    看起来您正在尝试使用 pre ANSI join 语法,但与 ANSI join 混合使用。它们完全是多余的,因为 SQLAlchemy 可以根据模型之间的外键关系推断连接的 ON 子句。原始 SQL 以类似的方式被破坏

    FROM
        organizations O
    JOIN activities_area A JOIN ...
    

    在 O 和 A 之间根本没有 ON 子句,此外,如果不先加入关联表,就没有明显的方法可以加入它们。总而言之:

    organizations_query = session.query(O.id, O.label, A.name) \
        .join(S) \
        .join(A) \
        .order_by(O.label) \
        .all()
    

    【讨论】:

      猜你喜欢
      • 2021-09-21
      • 2015-07-30
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-10
      • 2018-08-12
      • 2017-05-26
      相关资源
      最近更新 更多