Python 在炼金术中渴望内在的结合

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() 城市和州模

我一定是个白痴,因为我不知道如何让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()
城市和州模型已经定义了关系,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级别完全透明,即渴望加载不应以加载相关对象以外的任何其他方式更改
查询的结果。当然,实际的核心陈述可能有所不同。