检查.sqlAlchemy中的.one()是否为空
我正在根据其他的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()
查看文档 这里