Исключение InvalidRequestError
Исключение InvalidRequestError наследуется от
базового класса SQLAlchemyError и вызывается,
когда SQLAlchemy получает запрос, который не может
быть корректно обработан на уровне ORM. Чаще всего
это связано с работой сессии: обращение к объекту,
который не привязан к сессии, использование
неправильного состояния транзакции или попытка
выполнить операцию с объектом, находящимся в
недопустимом состоянии.
Это исключение не связано с ошибками на стороне базы данных, а сигнализирует о логической ошибке в коде приложения при взаимодействии с ORM.
Синтаксис
from sqlalchemy.exc import InvalidRequestError
raise InvalidRequestError(message, params, orig)
Пример
Давайте попробуем добавить в сессию объект, который уже привязан к другой сессии. Это классический случай возникновения исключения:
from sqlalchemy import create_engine, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
from sqlalchemy.exc import InvalidRequestError
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(50))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
session_one = Session(engine)
session_two = Session(engine)
article = Article(title='article')
session_one.add(article)
session_one.commit()
try:
session_two.add(article)
except InvalidRequestError as error:
print(type(error).__name__)
Результат выполнения кода:
"InvalidRequestError"
Пример
Ещё один частый случай - попытка обновить объект, который был удалён или отсоединён от сессии:
from sqlalchemy import create_engine, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
from sqlalchemy.exc import InvalidRequestError
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(50))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article')
session.add(article)
session.commit()
session.expunge(article)
try:
article.title = 'user'
session.add(article)
session.flush()
except InvalidRequestError as error:
print(type(error).__name__)
Результат выполнения кода:
"InvalidRequestError"
Пример
Исключение также возникает при попытке выполнить запрос к сессии, которая уже закрыта:
from sqlalchemy import create_engine, String, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
from sqlalchemy.exc import InvalidRequestError
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(50))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
session = Session(engine)
session.close()
try:
res = session.execute(select(Article)).scalars().all()
print(res)
except InvalidRequestError as error:
print(type(error).__name__)
Результат выполнения кода:
"InvalidRequestError"
Смотрите также
-
исключение
SQLAlchemyError,
которое является базовым для всех ошибок SQLAlchemy -
исключение
ArgumentError,
которое возникает при неверных аргументах функций -
исключение
PendingRollbackError,
которое сигнализирует о необходимости отката транзакции -
исключение
UnmappedInstanceError,
которое возникает при работе с немаппированным объектом