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