Проверьте, является ли .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