关于 flask-sqlachemy 数据库回滚的问题

2020-09-24 14:14:42 +08:00
 Macv1994

1.每一个 session 是否在当前请求结束后自动销毁? 2.如果执行 commit 出错,需不需要进行回滚? 3.如果需要进行回滚,应该怎么写?(在每一个 commit 操作地方写 rollback?有没有类似装饰器的方法?) 烦请各位大佬指教一下..

1659 次点击
所在节点    Python
5 条回复
Macv1994
2020-09-24 14:29:44 +08:00
```python
def db_exception_handle(db):
def decorator(func):
@wraps(func)
def decorated_function(*args, **kwargs):
try:
return func(*args, **kwargs)
except:
db.session.rollback()
abort(500)
return decorated_function
return decorator
```
这样子写不知道是否可以,传进来的 db 不知道是不是当前请求上下文环境。测试了一下感觉没问题。
ila
2020-09-24 14:34:18 +08:00
有开始事务的参数配置,看官方文档
qile1
2020-09-25 16:52:48 +08:00
数据库执行时候有事物回滚语句,把回滚语句放到异常处理里面
Macv1994
2020-09-27 10:56:48 +08:00
@qile1 恩,这个我知道,但是数据库操作的地方很多呀,怎么处理比较方便一点,不能在每个地方都写一个 try...except 语句吧...
lilililili1010
2020-09-29 15:10:36 +08:00
```
from flask_sqlalchemy import SQLAlchemy as _SQLAlchemy
class SQLAlchemy(_SQLAlchemy):
@contextmanager
def auto_commit(self, throw=True):
try:
yield
self.session.commit()
except Exception as e:
self.session.rollback()
current_app.logger.exception('%r' % e)
if throw:
raise e
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/710110

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX