You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLAlchemy 2.0中session.scalar(stmt)与session.execute(stmt).scalar_one_or_none()是否等价?

SQLAlchemy 2.0中session.scalar(stmt)与session.execute(stmt).scalar_one_or_none()是否等价?

你观察得太准了!在SQLAlchemy 2.0里,这两种写法在你测试的查询场景下完全等价——不管是找到匹配的Band对象返回单个实例,还是没找到返回None,表现都一模一样。

我给你拆解下两者的逻辑,帮你彻底搞懂:

  • session.scalar(stmt):它会自动执行传入的SELECT语句,直接从结果集中提取第一行的目标对象(这里就是你的Band实例);如果结果集为空,就返回None;要是查询意外返回多条结果,它会抛出MultipleResultsFound异常。
  • session.execute(stmt).scalar_one_or_none():session.execute()返回Result对象,调用scalar_one_or_none()方法时,同样会提取单个目标对象,没结果返回None,多结果也会抛出相同的MultipleResultsFound异常。

就像你写的这两个函数:

def get_band1(session: Session, band_id: int) -> Band | None:
    stmt = select(Band).filter_by(id=band_id)
    return session.scalar(stmt)

def get_band2(session: Session, band_id: int) -> Band | None:
    stmt = select(Band).filter_by(id=band_id)
    return session.execute(stmt).scalar_one_or_none()

因为你是按唯一的id查询,根本不会出现多结果的情况,所以这两个函数的行为完全一致,日常开发里选哪种全看个人习惯就行。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 09:48:07