flask-SQLAlchemy 使用 session.commit() 处理异常回滚

最为原始的try/except办法,多次插入数据就要写多次,很麻烦,使用python原生的contextlib.contextmanager简化代码!

 try:
    user_db = User(email=self.email, nickname=self.nickname, password=self.password)
    db.session.add(user_db)
    #所有的数据处理准备好之后,执行commit才会提交到数据库!
    db.session.commit()
except Exception as e:
    #加入数据库commit提交失败,必须回滚!!!
    db.session.rollback()
    raise e

最优化的一种方式,这种方法很牛逼!(对于多个try/except很好的重复性)

from flask_sqlalchemy import SQLAlchemy as BaseSQLAlchemy
from contextlib import contextmanager

# 自定义一个SQLAlchemy继承flask_sqlalchemy的,方便自定义方法!!!
class  SQLAlchemy(BaseSQLAlchemy):
 
    # 利用contextmanager管理器,对try/except语句封装,使用的时候必须和with结合!!!
    @contextmanager
    def auto_commit_db(self):
        try:
            yield
            self.session.commit()
        except Exception as e:
           # 加入数据库commit提交失败,必须回滚!!!
           self.session.rollback()
           raise e
 
db = SQLAlchemy()

利用with上下文管理方法调用!

from kirin_app.db_models.table_user import User
from kirin_app.db_models import db
 
 
class RegisterViewModel:
 
    def __init__(self,form_data):
        self.email = form_data["email"]
        self.nickname = form_data["nickname"]
        self.password = form_data["password"]
 
        self.__add_db_data()
 
    # 把数据添加进入数据库
    def __add_db_data(self):
        with db.auto_commit_db():
            user_db = User(email=self.email, nickname=self.nickname, password=self.password)
            db.session.add(user_db)
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`db.session.rollback()` 是 Flask-SQLAlchemy 提供的一个方法,用于回滚当前数据库会话中的所有未提交的更改。 当使用 SQLAlchemy 进行数据库操作时,通常会在一个会话(session)中进行多个数据库操作,比如插入、更新、删除等。在执行这些操作过程中,如果出现错误或者需要取消之前的更改,可以使用 `db.session.rollback()` 方法来回滚到之前的状态。 具体来说,`db.session.rollback()` 方法会撤销当前会话中的所有未提交的更改,包括添加的新对象、更新的对象和删除的对象。它会将数据库会话重置为最近一次提交之前的状态。 使用示例: ```python from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'your_database_uri' db = SQLAlchemy(app) @app.route('/') def index(): try: # 执行一些数据库操作 # ... db.session.commit() # 提交更改 except: db.session.rollback() # 出错时回滚更改 finally: db.session.close() # 关闭会话 return 'Hello, World!' if __name__ == '__main__': app.run() ``` 在上述示例中,我们在一个路由函数中进行数据库操作。如果操作成功,我们调用 `db.session.commit()` 提交更改。如果发生错误,我们调用 `db.session.rollback()` 回滚未提交的更改。无论如何,我们都要调用 `db.session.close()` 来关闭会话,释放资源。 总结一下,`db.session.rollback()` 方法用于回滚当前数据库会话中的所有未提交的更改,以保持数据库的一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值