我正在根据查询的其他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()
如果没有结果,有没有办法跳过查询?
在SO 上找到解决方案(之前找不到) Getting first row from sqlalchemy
答案 0 :(得分:43)
使用first()
功能代替one()
。如果没有结果,它将返回None。
sub_report_id = DBSession.query(TSubReport.ixSubReport).filter(and_(TSubReport.ixSection==sectionID[0], TSubReport.ixReport== reportID[0])).first()
请参阅文档here
答案 1 :(得分:28)
您也可以使用one_or_none()
,当找不到结果并且语法清晰度高于None
时,会返回first()
。无需处理错误。
答案 2 :(得分:9)
如果不进行查询,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