我试图提高一些查询性能,但生成的查询看起来并不像我期望的那样。
使用以下方式检索结果:
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
and 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')
joinload() 和 joinload_all() 仅用作一次性加载相关集合的一种方法,不用于过滤/排序!。请阅读:
http://docs.sqlalchemy.org/en/latest/orm/tutorial.html#joined-load 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 http://docs.sqlalchemy.org/en/latest/orm/loading.html#the-zen-of-eager-loading
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)