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

Исключение DataError

Исключение DataError в SQLAlchemy возникает, когда база данных сообщает об ошибке, связанной с некорректными данными. Это может быть переполнение числового поля, слишком длинная строка для колонки, деление на ноль или несоответствие формата данных ожидаемому типу колонки. Класс DataError является наследником DBAPIError и оборачивает исключение драйвера базы данных, связанное с проблемой самих данных, а не с соединением или запросом.

Синтаксис

from sqlalchemy.exc import DataError try: # database operation pass except DataError as e: print(e)

Пример

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

from sqlalchemy import create_engine, Integer, String from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session from sqlalchemy.exc import DataError class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(5)) text: Mapped[str] = mapped_column(String(10)) status: Mapped[str] = mapped_column(String(20)) num: Mapped[int] = mapped_column(Integer) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: try: article = Article( title='article', text='long text content', status='published', num=1 ) session.add(article) session.commit() print('article added') except DataError as e: session.rollback() print('DataError:', e)

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

"DataError: (sqlite3.DataError) ..."

Пример

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

<+python+> from sqlalchemy import create_engine, SmallInteger, String from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session from sqlalchemy.exc import DataError class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(50)) text: Mapped[str] = mapped_column(String(100)) status: Mapped[str] = mapped_column(String(20)) num: Mapped[int] = mapped_column(SmallInteger) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: try: article = Article( title='article', text='some text', status='draft', num=100000 ) session.add(article) session.commit() print('article added') except DataError as e: session.rollback() print('DataError:', e) <-python+>

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

"DataError: (sqlite3.DataError) ..."

Пример

Давайте обработаем исключение DataError и выведем информацию об исходной ошибке драйвера через атрибут orig:

from sqlalchemy import create_engine, String from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session from sqlalchemy.exc import DataError class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(3)) text: Mapped[str] = mapped_column(String(100)) status: Mapped[str] = mapped_column(String(20)) num: Mapped[int] engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: try: article = Article( title='article', text='text', status='user', num=1 ) session.add(article) session.commit() except DataError as e: session.rollback() print('original error:', type(e.orig).__name__) print('statement:', e.statement)

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

"original error: DataError" "statement: INSERT INTO articles (title, text, status, num) VALUES (?, ?, ?, ?)"

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

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