flask -sqlalchemy откат лучшие практики - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь найти некоторую ясность в отношении лучших практик, где в 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)
...