Как правильно обрабатывать исключения в SQLAlchemy

Ответ

Правильная обработка исключений в SQLAlchemy критически важна для поддержания целостности данных и стабильности сессии. Основной принцип — откат транзакции (rollback) при любой ошибке.

Ключевые шаги:

  1. Используйте блок try...except: Оберните операции с базой данных (добавление, изменение, удаление) в этот блок.
  2. Вызывайте session.rollback() в блоке except: При возникновении исключения транзакция переходит в неактивное состояние. rollback() отменяет все изменения в рамках этой транзакции и возвращает сессию в рабочее состояние.
  3. Отлавливайте конкретные исключения: Для более точной логики лучше отлавливать специфичные подклассы 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-запросе (например, неверный синтаксис, несуществующая таблица).