Ответ
Правильная обработка исключений в SQLAlchemy критически важна для поддержания целостности данных и стабильности сессии. Основной принцип — откат транзакции (rollback
) при любой ошибке.
Ключевые шаги:
- Используйте блок
try...except
: Оберните операции с базой данных (добавление, изменение, удаление) в этот блок. - Вызывайте
session.rollback()
в блокеexcept
: При возникновении исключения транзакция переходит в неактивное состояние.rollback()
отменяет все изменения в рамках этой транзакции и возвращает сессию в рабочее состояние. - Отлавливайте конкретные исключения: Для более точной логики лучше отлавливать специфичные подклассы
SQLAlchemyError
.
Пример:
from sqlalchemy.exc import SQLAlchemyError, IntegrityError
# session - ваш объект сессии
try:
# Какие-либо операции с БД
new_user = User(name="test", email="test@example.com")
session.add(new_user)
session.commit()
except IntegrityError as e:
# Ошибка нарушения уникальности, внешнего ключа и т.д.
session.rollback()
print(f"Ошибка целостности данных: {e}")
except SQLAlchemyError as e:
# Все остальные ошибки SQLAlchemy
session.rollback()
print(f"Произошла ошибка базы данных: {e}")
finally:
# Сессию важно закрывать, чтобы освободить соединение с БД
session.close()
Основные типы исключений:
IntegrityError
: Нарушение ограничений целостности базы данных (например, дублирование уникального ключа).OperationalError
: Проблемы, связанные с работой базы данных (например, потеря соединения, таймаут).ProgrammingError
: Ошибки в самом SQL-запросе (например, неверный синтаксис, несуществующая таблица).