我试图找出一些最佳实践,以便最好地处理烧瓶应用程序数据库中的错误并执行回滚。我浏览了 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)