2012-03-22 6 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

? 0.7.4では、 'Foo'は一度だけ結合されます。 – van

答えて

4

あなたがフィルタリングする場合は、あなたが)(結合を使用、参加する:1回のパスで関連のコレクションをロードするための手段としてのみ使用されている)(

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を())(参加に代わるものではありません":

SAのバージョンを使用している

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

関連する問題