首页 > 解决方案 > 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

标签: pythonormsqlalchemypython-db-api

解决方案


我可能有点偏离这里,但是您是否尝试过明确传递连接条件?

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' 配置如何。


推荐阅读