python - SQLAlchemy 中的 Eager Inner Join
问题描述
我一定是个白痴,因为我不知道如何让 SQLAlchemy 执行一个简单的、非惰性的内部连接。换句话说,在单个查询中返回所有结果。
我想运行的原始 SQL 查询是:
select
city.population,
state.name
from
city c inner join state s
on c.state_id = s.id
我使用的 SQLAlchemy 语句是:
session.query(City.population, State.name).all()
City 和 State 模型已经定义了关系,并且 SQLAlchemy 语句返回正确的值。但这需要很长时间,因为它正在为记录集中每一行的第二个值进行单独的“延迟”加载。FROM 语句很简单:FROM city, state
- 我尝试了各种配置
options(joinedload(something here))
- 我已经阅读了“The Zen of Eager Loading”,我发现它没有帮助,因为它假定查询要求的是整个模型对象,而不是特定的列。
- 我读了这个答案,它说joinedload“意味着完全透明”,我不同意,因为它似乎需要重新安排核心查询。
解决方案
我可能有点偏离这里,但是您是否尝试过明确传递连接条件?
q = session.query(City.population, State.name).join(State).all()
此外,假设您的目标是初始查询,您是否尝试过对sqlalchemy
语法进行一些调整以实际获得相同的语句?
print (q.statement)
最后,Query
类有一个方法enable_eagerloads()
。从文档:
控制是否呈现渴望连接和子查询。
当设置为 False 时,返回的 Query 将不会呈现渴望连接,无论joinedload()、subqueryload() 选项或映射器级别的lazy='joined'/lazy='subquery' 配置如何。
推荐阅读
- reactjs - React - 如何在不更新第二个默认字段的情况下根据之前的 DropDown 填充一个 DropDown
- azure - 配置为使用 SignalR 的 AWS Lambda (.NET web api) 无法连接到 S3 网站
- python - 具有多个元素的数组的真值是不明确的。使用 a.any() 或 a.all() - Numpy 库
- vb.net - 寻找一种循环方式,直到 TCP 数据包的值 = 1
- java - 如何使用 pom.xml 更新属性文件中的环境值
- c# - 在屏幕保护程序/屏幕关闭期间在 UWP 中使用 Syncfusion 的图表时进程内存较高
- r - r 中的嵌套 for 循环错误(包 extRemes)
- javascript - 为什么当我在 app.js 上使用控制台登录时它会得到未定义的返回?
- vb.net - 循环遍历空文本框,直到文本框有数据
- bash - 从脚本中的字符串获取纪元