クエリの他の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で解決策を見つけた(以前は見つけられなかった) sqlalchemyから最初の行を取得する
first()
の代わりにone()
関数を使用します。結果がなければNoneを返します。
sub_report_id = DBSession.query(TSubReport.ixSubReport).filter(and_(TSubReport.ixSection==sectionID[0], TSubReport.ixReport== reportID[0])).first()
ドキュメントを参照してください こちら
one_or_none()
を使用することもできます。これは、結果が見つからない場合にNone
を返し、first()
よりも構文的に明確です。エラー処理は不要です。
ref: one_or_none()
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