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

Исключение IntegrityError

Исключение IntegrityError относится к группе исключений DBAPIError и возникает, когда СУБД отклоняет операцию из-за нарушения ограничений целостности данных. К таким ограничениям относятся уникальность UNIQUE, обязательность NOT NULL, внешние ключи FOREIGN KEY и проверки CHECK. Исключение обычно возникает в момент выполнения запроса или сброса сессии flush и требует отката транзакции методом rollback.

Синтаксис

from sqlalchemy.exc import IntegrityError

Пример

Давайте создадим таблицу с уникальным полем и попробуем вставить дублирующую запись:

from sqlalchemy import create_engine, String from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session from sqlalchemy.exc import IntegrityError class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(50), unique=True) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: session.add(Article(title='article')) session.commit() try: session.add(Article(title='article')) session.commit() except IntegrityError as err: session.rollback() print('IntegrityError caught')

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

"IntegrityError caught"

Пример

Давайте выведем текст исходной ошибки СУБД через атрибут orig:

from sqlalchemy import create_engine, String from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session from sqlalchemy.exc import IntegrityError class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(50), unique=True) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: session.add(Article(title='article')) session.commit() try: session.add(Article(title='article')) session.commit() except IntegrityError as err: session.rollback() print(err.orig)

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

"UNIQUE constraint failed: articles.title"

Пример

Давайте поймаем ошибку при нарушении ограничения NOT NULL:

from sqlalchemy import create_engine, String from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session from sqlalchemy.exc import IntegrityError class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(50), nullable=False) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: try: session.add(Article(title=None)) session.commit() except IntegrityError as err: session.rollback() print('NOT NULL violation')

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

"NOT NULL violation"

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

  • класс DBAPIError,
    который является родителем IntegrityError
  • класс SQLAlchemyError,
    который представляет базовое исключение библиотеки
  • класс OperationalError,
    который возникает при ошибках работы СУБД
  • класс PendingRollbackError,
    который сигнализирует о необходимости отката транзакции
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить