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

Исключение UnmappedClassError

Исключение UnmappedClassError возникает, когда SQLAlchemy пытается выполнить операцию с классом, который не был зарегистрирован в системе маппинга ORM. Это означает, что класс не наследуется от декларативной базы или не был связан с таблицей через функцию mapper или реестр. Исключение наследуется от SQLAlchemyError и обычно сигнализирует о том, что объект не является частью маппированной иерархии.

Синтаксис

from sqlalchemy.orm.exc import UnmappedClassError raise UnmappedClassError(class_, msg=None)

Пример

Давайте попробуем получить маппированный атрибут у класса, который не зарегистрирован в ORM:

from sqlalchemy import create_engine from sqlalchemy.orm import Session from sqlalchemy.orm.exc import UnmappedClassError class Article: pass engine = create_engine('sqlite:///:memory:') with Session(engine) as session: try: articles = session.query(Article).all() except UnmappedClassError as e: print(type(e).__name__) print(e)

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

UnmappedClassError Class <class '__main__.Article'> is not mapped

Пример

Давайте создадим правильную модель и убедимся, что исключение больше не возникает:

<+python+> from sqlalchemy import create_engine, String from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session from sqlalchemy.orm.exc import UnmappedClassError 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: session.add(Article(title='article 1')) session.commit() try: res = session.query(Article).all() print([a.title for a in res]) except UnmappedClassError as e: print('error:', e) <-python+>

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

['article 1']

Пример

Давайте проверим состояние маппинга через инспектор и посмотрим, как исключение связано с отсутствием регистрации класса:

<+python+> from sqlalchemy import create_engine, inspect from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column from sqlalchemy.orm.exc import UnmappedClassError class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] class User: pass engine = create_engine('sqlite:///:memory:') for cls in (Article, User): try: mapper = inspect(cls) print(cls.__name__, '->', mapper) except Exception as e: print(cls.__name__, '->', type(e).__name__) <-python+>

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

Article -> Mapper[Article(articles)] User -> NoInspectionAvailable

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

  • исключение UnmappedInstanceError,
    которое возникает при работе с немаппированным экземпляром
  • исключение SQLAlchemyError,
    которое является базовым для всех ошибок SQLAlchemy
  • исключение InvalidRequestError,
    которое сигнализирует о некорректном запросе к ORM
  • исключение ArgumentError,
    которое возникает при неверных аргументах функций
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить