Исключение NoResultFound
Исключение NoResultFound наследуется от
InvalidRequestError и возбуждается в тех случаях,
когда код ожидает ровно одну строку результата, а
запрос не возвращает ни одной. Чаще всего оно
возникает при вызове методов one и
scalar_one. Параметров у самого исключения нет,
но у него есть атрибуты statement,
params и orig, унаследованные от
базовых классов.
Синтаксис
from sqlalchemy.exc import NoResultFound
raise NoResultFound(statement, params, orig)
Пример
Давайте создадим таблицу и попробуем получить
единственную запись методом one, когда
таблица пуста:
from sqlalchemy import create_engine, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
from sqlalchemy.exc import NoResultFound
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
try:
res = session.execute(
select(Article).where(Article.title == 'article')
).one()
print(res)
except NoResultFound as e:
print('NoResultFound:', e)
Результат выполнения кода:
"NoResultFound: No row was found when one was required"
Пример
Давайте добавим запись и снова выполним запрос, чтобы убедиться, что исключение не возбуждается:
from sqlalchemy import create_engine, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
from sqlalchemy.exc import NoResultFound
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(Article(title='article'))
session.commit()
try:
res = session.execute(
select(Article).where(Article.title == 'article')
).one()
print(res.title)
except NoResultFound as e:
print('NoResultFound:', e)
Результат выполнения кода:
"article"
Пример
Давайте используем метод scalar_one, который
также возбуждает NoResultFound, когда строк
нет:
from sqlalchemy import create_engine, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
from sqlalchemy.exc import NoResultFound
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
try:
res = session.execute(
select(Article.title).where(Article.title == 'article')
).scalar_one()
print(res)
except NoResultFound as e:
print('NoResultFound:', e)
Результат выполнения кода:
"NoResultFound: No row was found when one was required"
Пример
Давайте перехватим исключение и обработаем его, вернув значение по умолчанию:
from sqlalchemy import create_engine, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
from sqlalchemy.exc import NoResultFound
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
try:
res = session.execute(
select(Article).where(Article.id == 1)
).one()
title = res.title
except NoResultFound:
title = 'default article'
print(title)
Результат выполнения кода:
"default article"
Смотрите также
-
исключение
MultipleResultsFound,
которое возбуждается, когда метод one находит несколько строк -
исключение
InvalidRequestError,
от которого наследуется NoResultFound -
исключение
SQLAlchemyError,
базовое исключение всех ошибок SQLAlchemy -
исключение
StatementError,
которое оборачивает ошибки выполнения запросов