web-dev-qa-db-ja.com

.one()が空かどうかを確認しますsqlAlchemy

クエリの他の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から最初の行を取得する

26
john

first()の代わりにone()関数を使用します。結果がなければNoneを返します。

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

ドキュメントを参照してください こちら

45
Lynch

one_or_none()を使用することもできます。これは、結果が見つからない場合にNoneを返し、first()よりも構文的に明確です。エラー処理は不要です。

ref: one_or_none()

30
ythdelmar

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
10
kylie.a