Skip to main content
 首页 » 编程设计

python之使用连接表进行过滤

2025年05月04日18shanyou

我试图提高一些查询性能,但生成的查询看起来不像我期望的那样。

使用以下方法检索结果:

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

我想做的是对通过“first”连接的表进行过滤,但这种方式不起作用:

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

它会导致像这样的子句附加到查询中:

WHERE foos.address = '1.2.3.4' 

它没有以正确的方式进行过滤,因为生成的连接附加了表 foos_1 和 foos_2。如果我手动尝试该查询但将过滤子句更改为:

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

它工作正常。问题当然是 - 我怎样才能用 sqlalchemy 本身实现这个?

请您参考如下方法:

如果你想对连接进行过滤,你可以使用 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() 不是 join() 的替代品”的注释,以及:

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