vir*_*tor 1 python sql optimization join sqlalchemy
我试图提高一些查询性能,但生成的查询看起来并不像我期望的那样.
使用以下方法检索结果:
query = session.query(SomeModel).
options(joinedload_all('foo.bar')).
options(joinedload_all('foo.baz')).
options(joinedload('quux.other'))
Run Code Online (Sandbox Code Playgroud)
我想要做的是过滤通过'first'连接的表格,但这种方式不起作用:
query = query.filter(FooModel.address == '1.2.3.4')
Run Code Online (Sandbox Code Playgroud)
它会在查询中附加一个这样的子句:
WHERE foos.address = '1.2.3.4'
Run Code Online (Sandbox Code Playgroud)
其中没有以适当的方式进行过滤,因为生成的连接附加表foos_1和foos_2.如果我手动尝试该查询,但将过滤子句更改为:
WHERE foos_1.address = '1.2.3.4' AND foos_2.address = '1.2.3.4'
Run Code Online (Sandbox Code Playgroud)
它工作正常.问题当然是 - 我如何通过sqlalchemy本身实现这一目标?
如果要对连接进行过滤,请使用join():
session.query(SomeModel).join(SomeModel.foos).filter(Foo.something=='bar')
Run Code Online (Sandbox Code Playgroud)
joined()和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