Исключение 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:
Результат выполнения кода:
"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