web-dev-qa-db-fra.com

vérifier si .one () est vide sqlAlchemy

J'exécute une requête basée sur d'autres identifiants pour la requête. Le problème que j'ai est que parfois la requête ne trouvera pas de résultat. Au lieu de faire planter tout le programme, comment puis-je vérifier si le résultat sera Aucun?

Voici la requête que j'ai:

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

Lorsque le code est exécuté et qu'aucun résultat n'est trouvé, j'obtiens une exception NoResultFound

NoResultFound: No row was found for one()

existe-t-il un moyen de sauter la requête s'il n'y a pas de résultat?

J'ai trouvé la solution sur SO (impossible de la trouver auparavant) Obtenir la première ligne de sqlalchemy

26
john

Utilisez la fonction first() au lieu de one(). Il renverra None s'il n'y a aucun résultat.

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

voir la documentation ici

45
Lynch

Vous pouvez également utiliser one_or_none(), cela renvoie None quand aucun résultat n'est trouvé et est syntaxiquement plus clair que first(). Aucune gestion des erreurs requise.

réf: one_or_none ()

30
ythdelmar

Comment SQLAlchemy pouvait-il savoir qu'il n'y aurait pas de résultat sans faire la requête?

Vous devez intercepter l'exception et la gérer ensuite:

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