[英]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.