РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
689 of 711 menu

Исключение 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,
    которое возникает при работе с немаппированным объектом
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить