检查.one()是否为空sqlAlchemy

joh*_*ohn 29 python sqlalchemy pyramid

我正在运行基于查询的其他ID的查询.我遇到的问题是,有时查询将找不到结果.而不是让整个程序崩溃,我如何检查结果是否为None?

这是我的查询:

sub_report_id = DBSession.query(TSubReport.ixSubReport).filter(and_(TSubReport.ixSection==sectionID[0], TSubReport.ixReport== reportID[0])).one()
Run Code Online (Sandbox Code Playgroud)

当代码执行并且没有找到结果时,我得到一个NoResultFound异常

NoResultFound: No row was found for one()
Run Code Online (Sandbox Code Playgroud)

如果没有结果,有没有办法跳过查询?

在SO上找到解决方案(之前找不到) 从sqlalchemy获取第一行

Lyn*_*nch 48

使用first()功能而不是one().如果没有结果,它将返回None.

sub_report_id = DBSession.query(TSubReport.ixSubReport).filter(and_(TSubReport.ixSection==sectionID[0], TSubReport.ixReport== reportID[0])).first()
Run Code Online (Sandbox Code Playgroud)

请参阅此处的文档

  • 注意`.one()`和`.first()`之间有一个细微的区别 - 如果有多个result_,`.one()`也会失败,而`.first()`只会返回第一个结果,省略其余部分.当您意外地在同一部分中获得两个子报告时,可能会导致奇怪的行为 (7认同)

yth*_*mar 32

你也可以使用one_or_none(),None当没有找到结果时返回,并且语法清晰first().无需错误处理.

ref:one_or_none()

  • 这在语义上不等同于`first()`.`first()`默默地丢弃除第一行之外的所有行; `one_or_none()`在多个结果上引发异常.如果你想要替换`one()`,`one_or_none()`绝对是更好的答案. (3认同)

kyl*_*e.a 11

SQLAlchemy如何知道如果不进行查询就不会有结果?

您应该捕获异常并处理它:

from sqlalchemy.orm.exc import NoResultFound

try:
    sub_report_id = DBSession.query(TSubReport.ixSubReport).filter(and_(TSubReport.ixSection==sectionID[0], TSubReport.ixReport== reportID[0])).one()
except NoResultFound:
    sub_report_id = []  # or however you need to handle it
Run Code Online (Sandbox Code Playgroud)