Python 在炼金术中渴望内在的结合
我一定是个白痴,因为我不知道如何让SQLAlchemy执行一个简单的,非懒惰的内部联接。换句话说,在单个查询中返回所有结果 我要运行的原始SQL查询是:Python 在炼金术中渴望内在的结合,python,orm,sqlalchemy,python-db-api,Python,Orm,Sqlalchemy,Python Db Api,我一定是个白痴,因为我不知道如何让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() 城市和州模
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()
城市和州模型已经定义了关系,SQLAlchemy语句返回正确的值。但这需要永远,因为它对记录集中每行的第二个值进行单独的“惰性”加载。FROM语句很简单:fromcity,state
- 我已经尝试了各种
选项的配置(joinedload(这里有一些东西))
- 我读过“Zen of Earge Loading”,我发现它没有帮助,因为它假设查询要求的是整个模型对象,而不是特定的列李>
- 我读到其中说joinedload“意味着完全透明”,我不同意,因为它似乎需要重新安排核心查询
q=session.query(City.population,State.name).join(State.all)()
另外,假设您的目标是初始查询,您是否尝试过在sqlalchemy
语法中进行一些调整以实际获得相同的语句
print(q.statement)
最后,Query
类有一个方法enable\u()
。从:
控制是否呈现急切连接和子查询
当设置为False时,无论joinedload()、subqueryload()选项或映射器级别的lazy='joined'/lazy='subquery'配置如何,返回的查询都不会呈现急切连接
是的,我已经预览了构造的语句(通过echo=True),并尝试了
enable_eangerloads()
,加上joinedload
,以及来自的更多内容。具体地说:“虽然Query.join()用于更改查询结果,但joinedload()会花费大量时间来不更改查询结果”。事实上,添加query.join()
并没有改变结果,只是改变了返回结果的速度——因此,这句话似乎有误导性或不准确。感谢query.join()
的建议。我一直在努力阅读sqlalchemy
中的一些文档,甚至理解一些基本类的行为。很高兴这有点帮助。我非常喜欢SQL,并且在很长一段时间内故意避免使用ORM。我发现SQLAlchemy就像开着一辆一级方程式赛车穿过一个布满减速带的停车场。它的文档是其中的一大部分。哦,好吧。再次感谢。@exactabox引用的部分是准确的。即时加载是一个ORM概念,用于填充关系,而Query.join()
则用于显式连接(用于过滤,或其他常见的SQL内容)。在ORM级别完全透明,即渴望加载不应以加载相关对象以外的任何其他方式更改查询的结果。当然,实际的核心陈述可能有所不同。