Исключение SQLAlchemyError
Исключение SQLAlchemyError представляет собой
базовый класс для всех исключений, которые
возникают при работе с библиотекой SQLAlchemy.
Оно наследуется от встроенного исключения
Exception и служит основой для всей
иерархии ошибок SQLAlchemy. Перехватывая
SQLAlchemyError, можно обработать
любую ошибку библиотеки, будь то проблема
с подключением, выполнением запроса или
работой с сессией.
Исключение не принимает обязательных
параметров при создании. Оно может быть
вызвано напрямую или использовано в
конструкции except для перехвата
всех дочерних исключений SQLAlchemy.
Синтаксис
from sqlalchemy.exc import SQLAlchemyError
raise SQLAlchemyError("error message")
Пример
Давайте создадим и вызовем исключение
SQLAlchemyError напрямую:
from sqlalchemy.exc import SQLAlchemyError
try:
raise SQLAlchemyError("custom sqlalchemy error")
except SQLAlchemyError as exc:
print(type(exc).__name__)
print(exc)
Результат выполнения кода:
"SQLAlchemyError"
"custom sqlalchemy error"
Пример
Давайте перехватим ошибку SQLAlchemy при выполнении некорректного запроса:
from sqlalchemy import create_engine, text
from sqlalchemy.exc import SQLAlchemyError
engine = create_engine('sqlite:///:memory:')
try:
with engine.connect() as conn:
conn.execute(text('SELECT * FROM nonexistent_table'))
except SQLAlchemyError as exc:
print("caught:", type(exc).__name__)
Результат выполнения кода:
"caught: OperationalError"
Пример
Давайте проверим, что дочерние исключения
наследуются от SQLAlchemyError:
from sqlalchemy.exc import (
SQLAlchemyError,
IntegrityError,
OperationalError,
ProgrammingError,
DBAPIError,
)
for exc_class in (IntegrityError, OperationalError, ProgrammingError, DBAPIError):
print(exc_class.__name__, issubclass(exc_class, SQLAlchemyError))
Результат выполнения кода:
"IntegrityError True"
"OperationalError True"
"ProgrammingError True"
"DBAPIError True"
Пример
Давайте обработаем ошибку вставки дублирующегося первичного ключа через родительское исключение:
from sqlalchemy import create_engine, text
from sqlalchemy.exc import SQLAlchemyError
engine = create_engine('sqlite:///:memory:')
with engine.begin() as conn:
conn.execute(text('CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)'))
conn.execute(text("INSERT INTO articles (id, title) VALUES (1, 'article')"))
try:
with engine.begin() as conn:
conn.execute(text("INSERT INTO articles (id, title) VALUES (1, 'article')"))
except SQLAlchemyError as exc:
print("error type:", type(exc).__name__)
print("is sqlalchemy error:", isinstance(exc, SQLAlchemyError))
Результат выполнения кода:
"error type: IntegrityError"
"is sqlalchemy error: True"
Смотрите также
-
исключение
DBAPIError,
которое оборачивает ошибки драйвера базы данных -
исключение
IntegrityError,
которое возникает при нарушении ограничений целостности -
исключение
OperationalError,
которое сигнализирует об ошибках работы с базой данных -
исключение
ProgrammingError,
которое возникает при ошибках программирования SQL