were query practices one multiple in_ found for example best auth and python sqlalchemy pyramid

python - query - compruebe si.one() está vacío sqlAlchemy



sqlalchemy multiple rows were found for one() (3)

Estoy ejecutando una consulta basada en otros identificadores para la consulta. El problema que tengo es que a veces la consulta no encuentra un resultado. En lugar de que el programa se cuelgue por completo, ¿cómo puedo verificar si el resultado será Ninguno?

Esta es la consulta que tengo:

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

Cuando el código se ejecuta y no se encuentran resultados, obtengo una excepción NoResultFound

NoResultFound: No row was found for one()

¿hay una manera de simplemente omitir la consulta si no va a haber un resultado?

Encontré la solución en SO (no la encontré antes) Obteniendo la primera fila de sqlalchemy


¿Cómo sabría SQLAlchemy que no iba a haber un resultado sin hacer la consulta?

Deberías atrapar la excepción y manejarla entonces:

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


También puede usar one_or_none() , esto devuelve None cuando no se encuentra ningún resultado y es sintácticamente más claro que el first() . No se requiere manejo de errores.

ref: one_or_none()


Use la first() función first() lugar de one() . Se devolverá Ninguno si no hay resultados.

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

ver documentación here