我在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。因此,表组织和活动都由关联组织活动链接。
如何让它工作?
1条答案
按热度按时间omhiaaxx1#
交换连接的顺序。原始sql和查询都有相同的问题,因此:
要添加的where子句
看起来您正在尝试使用pre-ansi-join语法,但与ansi-join混合使用。它们是完全多余的,因为sqlalchemy可以根据模型之间的外键关系推断连接的on子句。原始sql的破坏方式与此类似
在o和a之间根本没有on子句,此外,如果不首先加入关联表,也没有明显的方法来连接它们。总而言之: