Внешнее соединение с отображением ORM в SQLAlchemy - PullRequest
13 голосов
/ 05 июня 2011

Я использую ORM Mapping в SQLAlchemy 0.6.8.

У меня есть три таблицы (A, B и C) без внешних ключей между ними.

Я пытаюсь объединить таблицы A и B, а затем оставил внешнее соединение с C. Это ожидание именованного кортежа с полями A, B и C - с полем C, иногда равным None.)

Я могу сделать первое объединение достаточно легко, просто выбрав обе таблицы.

(session.query(A, B)
    .filter(A.some_field = B.some_other_field))

Это дает мне NamedTuple с полями A и B.

Затем я добавляю внешнее соединение, чтобы сделать его:

(session.query(A, B)
    .filter(A.some_field==B.some_other_field))
    .outerjoin((C, A.some_field==C.some_different_field))

Результат имеет только две таблицы. Я не могу получить доступ к другим полям C (даже в тех случаях, когда они присутствуют).

Как правильно выполнить левое внешнее соединение, чтобы получить доступ к полям самой правой таблицы ??

Я бы предпочел не отступать от базового SQL, если бы мог его избежать - я пытаюсь научиться использовать в своих интересах ORM.

Ответы [ 2 ]

15 голосов
/ 05 июня 2011

Это должно работать:

(session.query(A)
    .join(B, A.some_field == B.some_other_field)
    .outerjoin(C, A.some_field == C.some_different_field)
    .add_entity(B)
    .add_entity(C))
0 голосов
/ 05 июня 2011

Предварительный ответ на мой собственный вопрос:

Этот код, по-видимому, генерирует нужный мне SQL:

(session.query(A, B, C)
    .filter(A.some_field==B.some_other_field))
    .outerjoin((C, A.some_field==C.some_different_field))

Обратите внимание на добавление параметра C воригинальный session.query звонок.

Похоже, это не делает то, что я думал: A, соединенный с B, соединенный с C, снова соединенный с C.

Я все еще тестирую.

...