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

Исключение UnmappedInstanceError

Исключение UnmappedInstanceError наследуется от SQLAlchemyError и возбуждается, когда ORM-операция пытается работать с объектом, класс которого не был отображён на таблицу. Например, это происходит при добавлении в сессию экземпляра обычного класса Python или экземпляра декларативной модели, у которой отсутствует маппинг.

Чаще всего исключение возникает при вызове метода add у сессии или при работе с атрибутами, требующими наличия инструментов ORM у объекта.

Синтаксис

from sqlalchemy.orm.exc import UnmappedInstanceError

Пример

Давайте попробуем добавить в сессию экземпляр обычного класса, не отображённого на таблицу:

from sqlalchemy import create_engine from sqlalchemy.orm import Session from sqlalchemy.orm.exc import UnmappedInstanceError class Article: def __init__(self, title): self.title = title engine = create_engine('sqlite:///:memory:') with Session(engine) as session: article = Article('article') try: session.add(article) session.commit() except UnmappedInstanceError as exc: print(type(exc).__name__) print(exc)

Результат выполнения кода:

"UnmappedInstanceError" "Class 'Article' is not mapped"

Пример

Давайте рассмотрим корректный вариант с декларативной моделью, отображённой на таблицу:

from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] text: Mapped[str] status: Mapped[str] num: Mapped[int]

Теперь объект успешно добавляется в сессию:

from sqlalchemy import create_engine from sqlalchemy.orm import Session from models import Base, Article engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: article = Article( title='article', text='text', status='draft', num=1 ) session.add(article) session.commit() print(article.id)

Результат выполнения кода:

"1"

Пример

Давайте перехватим исключение и выведем информативное сообщение об ошибке:

from sqlalchemy import create_engine from sqlalchemy.orm import Session from sqlalchemy.orm.exc import UnmappedInstanceError class User: pass engine = create_engine('sqlite:///:memory:') with Session(engine) as session: user = User() try: session.add(user) except UnmappedInstanceError: print('Object is not mapped to any table')

Результат выполнения кода:

"Object is not mapped to any table"

Смотрите также

  • класс UnmappedClassError,
    который возбуждается, когда не отображён сам класс
  • класс SQLAlchemyError,
    который является базовым для всех исключений SQLAlchemy
  • класс InvalidRequestError,
    который сигнализирует о некорректном запросе к сессии
  • класс DetachedInstanceError,
    который возникает при работе с отсоединённым объектом
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить