Проверьте, является ли .one() пустой sqlAlchemy

Я выполняю запрос, основанный на других идентификаторах для запроса. Проблема в том, что иногда запрос не находит результата. Вместо того, чтобы весь сбой программы, как я могу проверить, будет ли результат недействительным?

Это запрос, который у меня есть:

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

Ответ 1

Используйте first() функцию вместо one(). Он не вернет None, если результатов нет.

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

см. документацию здесь

Ответ 2

Вы также можете использовать one_or_none(), это возвращает None, когда результат не найден и синтаксически ясен, чем first(). Обработка ошибок не требуется.

ref: one_or_none()

Ответ 3

Как 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