繁体   English   中英

在SqlAlchemy中加入查询

[英]Join query in SqlAlchemy

我在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链接。

如何运作?

交换联接的顺序。 您的原始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) \
    ...

看起来您正在尝试使用ANSI之前的联接语法,但与ANSI联接混在一起。 它们是完全多余的,因为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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM