【发布时间】:2019-10-14 15:45:15
【问题描述】:
我正在查看我编写的一些旧代码,并且正在查看我编写的共享提交函数,用于在尝试提交对数据库的更改(例如删除)时处理对用户的响应:
def _commit_to_database():
"""A shared function to make a commit to the database and handle exceptions
if encountered.
"""
flask.current_app.logger.info('Committing changes to database...')
try:
db.session.commit()
except AssertionError as err:
flask.abort(409, err)
except (exc.IntegrityError, sqlite3.IntegrityError) as err:
flask.abort(409, err.orig)
except Exception as err:
flask.abort(500, err)
finally:
db.session.rollback()
我想我理解我的思考过程:尝试commit,在某些失败时触发flask.abort 发送回响应,但我相信我发现数据库留下了一个需要回滚的打开会话这样做并将rollback 添加到finally 语句中解决了这个问题,让我仍然可以使用flask.abort。
我对代码的疑问是:
1) 这是一个错误吗:Flask-SQLAlchemy 扩展不会正常关闭会话吗?正在调用finally 上的rollback,这将在abort 之后触发,会影响成功的commits?
2) 如果这是一个错误:在处理 try-except-finally 和 db 会话时我应该做些什么不同的事情?
【问题讨论】:
标签: python sqlalchemy