Присоединиться запрос в SqlAlchemy - PullRequest
0 голосов
/ 27 июня 2018

У меня есть этот запрос в 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 поля: идентификатор, идентификатор организации в качестве внешнего ключа и идентификатор области деятельности в качестве внешнего ключа. Таким образом, таблицы организации и действия связаны AssocOrganizationsActivities.

Как заставить это работать?

1 Ответ

0 голосов
/ 27 июня 2018

Поменяйте местами порядок соединений. И ваш сырой 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 ...

вообще не имеет предложения ON между O и A, кроме того, нет очевидного способа присоединиться к ним без предварительного присоединения к таблице ассоциации. Всего:

organizations_query = session.query(O.id, O.label, A.name) \
    .join(S) \
    .join(A) \
    .order_by(O.label) \
    .all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...