2015-04-06 30 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 

問題是,所有連接將應用於在查詢中選擇的表首先,即在這種情況下到A.

我可以使用一些假黑客喜歡:

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

但是,當然,這是不可取的。

有沒有一種方法可以指定將附加所有連接的基表?

回答

2

鑑於您的例子,你需要:

我的左部現在沒有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