在 Flask 中,所有扩展插件基本上都是以 Flask-Xxx 进行命名, Flask-SQLAlchemy 就是一个为 Flask 应用增加 SQLAlchemy 支持的扩展,致力于简化在 Flask 中 SQLAlchemy 的使用,而 SQLAlchemy 是 目前 Python 中最强大的 ORM 框架,功能全面,使用简单。
对于新增、修改、删除的操作,每次都需要写 db.session.commit() 进行提交,并且在业务逻辑中, 如果触发了异常,还需要调用 db.session.rollback() 进行回滚,例如:
pythontry: student = Student.query.first()
student.name = "imooc"
db.session.commit() except Exception as e: db.session.rollback()
对于重复性的操作,一般的方式是提供一个工具方法或工具类,所以可以重写 SQLAlchemy 核心类,创 建 auto_commit ,并使用 contextmanager 装饰该函数
pythonfrom contextlib import contextmanager
from flask_sqlalchemy import SQLAlchemy as _SQLAlchemy
class SQLAlchemy(_SQLAlchemy):
"""重写SQLAlchemy核心,实现数据自动提交"""
@contextmanager
def auto_commit(self):
try:
yield
self.session.commit()
except Exception as e:
self.session.rollback()
raise e
@contextmanager 装饰器的原理其实非常简单,它将生成器函数中 yield 之前的部分视为上下文的进 入操作,而 yield 之后的部分视为离开操作。因此,我们可以在 yield 之前对数据进行操作(新增、 修改、删除),在 yield 之后执行 self.session.commit() 提交更改。 有了该方法后,对于属于数据库操作,我们可以这样简化一部分代码:
python
def update_app(self, id: uuid.UUID) -> App:
"""更新app"""
with self.db.auto_commit():
app = self.get_app(id)
app.name = "SQL聊天机器人" + datetime.now().strftime("%Y%m%d%H%M")
# self.db.session.commit()
return app


本文作者:繁星
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!