在我们使用 flask-sqlalchemy 的时候, 在提交事务的时候, 都需要 commit:
try:
user = User()
....
db.session.commit()
except:
db.session.rollback()
现在可以使用更优雅的方式去做这件事:
from flask_sqlalchemy import SQLAlchemy as _SQLAlchemy
from contextlib import contextmanager
class SQLAlchemy(_SQLAlchemy):
@contextmanager
def auto_commit(self):
try:
yield
self.session.commit() # 事务
except Exception as e:
self.session.rollback() # 回滚
raise e
with db.auto_commit():
u = User()
......
db.session.add(u)
被装饰器装饰的函数分为三部分:
with语句中的代码块执行前执行函数中yield之前代码
yield返回的内容复制给as之后的变量
with代码块执行完毕后执行函数中yield之后的代码
参考博客:
https://blog.csdn.net/JENREY/article/details/86690018