2015-04-06 4 views
0

Предположим, у меня есть 3 таблицы: A, B, C.Укажите "базу" из-таблицы в SQLAlchemy

A: id, fieldA 
B: id, id_a, fieldB; id_a - foreign key for A.id 
C: id, id_b, fieldC; id_b - foreign key for B.id 

Теперь я хочу, чтобы запустить этот SQL-запрос:

SELECT A.fieldA, 
     B.fieldB 
FROM C 
     LEFT JOIN B 
      LEFT JOIN A 
       ON A.id = B.id_a 
     ON B.id = C.id_b 
WHERE C.fieldC = :myvalue 

запросе SQLAlchemy будет:

session.query(A.fieldA, B.fieldB).join(...).join(...).filter(C.fieldC == myvalue) 
           ^------------------^ issue here 

проблема заключается в том, что все стыки будут применены к столу, который был выбран в запросе первым, то есть в этом случае А.

я могу использовать фиктивный хак вроде:

session.query(C.fieldC, A.fieldA, B.fieldB).join(B).join(A).filter(C.fieldC == myvalue) 
       ^------^ I don't need this column 

Но, конечно, это не желательно.

Есть ли способ указать базовую таблицу, к которой будут привязаны все присоединения?

ответ

2

Учитывая ваш пример, вам нужно:

  • указать левую часть присоединиться с помощью select_from
  • и использовать outerjoinне внутреннее соединение)

I сейчас у меня нет SQLAlchemy, поэтому я не могу гарантировать, что это будет работать «из коробки», но что-то вроде, что было бы хорошим стартовым poi nt:

session.query(A.fieldA, B.fieldB)  \ 
      .select_from(C)    \ 
      .outerjoin(B, ....)   \ 
      .outerjoin(A, ....)   \ 
      .filter(C.fieldC == myvalue) 
+0

Sheesh ... Теперь я чувствую себя глупым, пропустив в документации 'select_from'. Спасибо! – mishik

Смежные вопросы