检查.sqlAlchemy中的.one()是否为空

53 投票
3 回答
66058 浏览
提问于 2025-04-18 14:58

我正在根据其他的ID来运行一个查询。我的问题是,有时候这个查询找不到结果。为了避免整个程序崩溃,我该如何检查结果是否为None呢?

这是我使用的查询:

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

当代码执行时,如果没有找到结果,我会收到一个NoResultFound的异常提示。

NoResultFound: No row was found for one()

有没有办法在没有结果的情况下直接跳过这个查询呢?

在Stack Overflow上找到了答案(之前没找到过)从sqlalchemy获取第一行

3 个回答

18

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
58

你也可以使用 one_or_none() 这个方法。当没有找到结果时,它会返回 None,而且这个写法比 first() 更清晰。使用这个方法不需要额外处理错误。

参考链接: one_or_none()

97

first() 函数代替 one()。如果没有找到结果,它会返回 None。

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

查看文档 这里

撰写回答