1

我试图找出一些最佳实践,以便最好地处理烧瓶应用程序数据库中的错误并执行回滚。我浏览了 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)将错误处理程序放在业务逻辑中。这是超级具体的,允许特定于用例的逻辑并在发生错误的地方捕获错误。但是,它添加了许多额外的代码来包装每个函数。一定会有更好的办法。

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)
4

0 回答 0