2012-03-22 84 views
1

我試圖讓一些查詢性能得到改進,但生成的查詢看起來並不像我期望的那樣。與連接表過濾

結果使用檢索:

query = session.query(SomeModel). 
     options(joinedload_all('foo.bar')). 
     options(joinedload_all('foo.baz')). 
     options(joinedload('quux.other')) 

我想要做的就是在桌子上過濾器通過「第一」的加入,但這種方式不工作:

query = query.filter(FooModel.address == '1.2.3.4') 

它的結果在附加到查詢的子句中:

WHERE foos.address = '1.2.3.4' 

這不會以正確的方式進行過濾,因爲生成的j附件附表foos_1foos_2。如果我手動嘗試該查詢,但將過濾條款更改爲:

WHERE foos_1.address = '1.2.3.4' AND foos_2.address = '1.2.3.4' 

它工作正常。這個問題當然是 - 我怎麼才能用sqlalchemy本身來實現呢?

+0

SA哪個版本您使用的?在0.7.4中,'Foo'只連接一次。 – van 2012-03-25 09:41:19

回答

4

如果你想過濾的連接,可以使用join()方法:

session.query(SomeModel).join(SomeModel.foos).filter(Foo.something=='bar') 

joinedload()和joinedload_all()只被用作加載相關的收藏品在一個循環中的手段,而不是用於過濾/訂購!。請閱讀:

http://docs.sqlalchemy.org/en/latest/orm/tutorial.html#joined-load - 註上 「joinedload()不是替代連接()」,以及:

http://docs.sqlalchemy.org/en/latest/orm/loading.html#the-zen-of-eager-loading