gpt4 book ai didi

python - SqlAlchemy 中的联接查询

转载 作者:行者123 更新时间:2023-11-29 10:10:25 26 4
gpt4 key购买 nike

我在 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()

关于python - SqlAlchemy 中的联接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51058587/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com