Я пытаюсь найти некоторую ясность в отношении лучших практик, где в flask приложениях следует лучше всего обрабатывать ошибки базы данных и выполнять откат. Я просмотрел документы по SQLAlchemy и не нашел никаких рекомендаций по наилучшей практике. Однако то, как я это делаю, не кажется мне продуманным решением. Вот два способа, которыми я реализовал обработку ошибок в базах данных.
1) Использование одного обработчика ошибок на уровне API. Это просто и легко. Однако, возможно, он отлавливает ошибку с опозданием и возвращает потенциально ненужную ошибку пользователю, когда простой откат и повторная попытка могут сработать.
@ERROR.app_errorhandler(sqlalchemy.exc.InvalidRequestError)
@ERROR.app_errorhandler(pymysql.err.OperationalError)
@ERROR.app_errorhandler(sqlalchemy.exc.OperationalError)
def operational_error_handler(error):
DB.session.rollback()
current_app.logger.error(f'Rolling back session due to an '
f'unhandled error {error}')
return {'message': 'SERVICE NOT AVAILABLE: The service is unavailable. '
'Please try again later.'}, 503
2) Поместите обработчики ошибок в бизнес-логи c , Это суперспецифический c, он позволяет указать регистр использования c logi c и фиксирует ошибку там, где она возникает. Тем не менее, он добавляет много дополнительного кода, чтобы обернуть каждую функцию. Должен быть лучший способ.
def get_thing(id):
"""Outer function to handle rollback"""
def _get_thing(id):
"""Inner function"""
thing = ThingModel.query.get(id)
DB.session.commit()
return thing
try:
return _get_thing(id)
except sqlalchemy.exc.OperationalError:
DB.session.rollback()
return _get_thing(id)