2026-05-16
Python
0

目录

重写SQLAlchemy核心类实现自动提交
commit与rollback

在 Flask 中,所有扩展插件基本上都是以 Flask-Xxx 进行命名, Flask-SQLAlchemy 就是一个为 Flask 应用增加 SQLAlchemy 支持的扩展,致力于简化在 Flask 中 SQLAlchemy 的使用,而 SQLAlchemy 是 目前 Python 中最强大的 ORM 框架,功能全面,使用简单。

文档资料

重写SQLAlchemy核心类实现自动提交

commit与rollback

对于新增、修改、删除的操作,每次都需要写 db.session.commit() 进行提交,并且在业务逻辑中, 如果触发了异常,还需要调用 db.session.rollback() 进行回滚,例如:

python
try: student = Student.query.first() student.name = "imooc" db.session.commit() except Exception as e: db.session.rollback()

对于重复性的操作,一般的方式是提供一个工具方法或工具类,所以可以重写 SQLAlchemy 核心类,创 建 auto_commit ,并使用 contextmanager 装饰该函数

python
from 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
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:繁星

本文链接:

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