2013-08-18 37 views
1

我目前很難找到一種方法來減少SQLAlchemy急切加載生成的多餘JOIN子句。我目前正在查詢TableA,它急切地加載TableB,TableB急切加載TableC減少SQLAlchemy生成的重複JOIN子句

我的查詢也調用顯式加入到TableBTableC以便過濾這些表的列。然而,它產生詳細的SQL如下所示:

SELECT * FROM TableA 
      JOIN TableB    ON TableA.fk == TableB.id 
      JOIN TableC    ON TableB.fk == TableC.id 
LEFT OUTER JOIN TableB AS TableB_1 ON TableA.fk == TableB.id 
LEFT OUTER JOIN TableC AS TableC_1 ON TableB.fk == TableC.id 

我目前使用lazy='joined'的反向引用從TableA查詢熱切負荷TableBTableC。用子查詢加載這些數據會產生一個N + 1選擇問題(因此從急切切換到延遲加載不是一種選擇)。

我試過還加入innerjoin=True的反向引用,它用內部聯接替換了LEFT OUTER JOIN子句(輸出中只有JOIN)。我希望SQLAlchemy會合並相同的連接子句,但似乎並不一樣。

有沒有一種方法可以在查詢或關係上指定相同的連接子句不應該重複?

回答

1

你能告訴我們代碼嗎?目前還不清楚你到底在做什麼。

爲了從顯式聯接中熱切地填充關係集合,您應該使用contains_eager選項而不是joinedload。即

from sqlalchemy.orm import contains_eager, joinedload 

session.query(ModelA).join(ModelB).options(contains_eager(ModelA.bs_list)).all() 

,而不是

session.query(ModelA).join(ModelB).options(joinedload(ModelA.bs_list)).all() 
+0

感謝。我忽略了關係文檔中的「contains_eager」部分。那正是我所期待的。 – efritz