使用SQLAlchemy中请求结束后自动提交数据库的一个注意点

在SQLAlchemy的init_app函数中配置SQLALCHEMY_COMMIT_ON_TEARDOWN为True是可以在请求结束时自动提交数据库数据,不用手动提交,但是

@app.teardown_appcontext
        def shutdown_session(response_or_exc):
            if app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']:
                if response_or_exc is None:
                    self.session.commit()
            self.session.remove()
            return response_or_exc

出现提交失败的话没有进行处理,会报错,所以这里需要修改一下

@app.teardown_appcontext
        def shutdown_session(response_or_exc):
            if app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']:
                if response_or_exc is None:
                    # 提交失败后,回滚,防止报错
                    try:
                        self.session.commit()
                    except BaseException as e:
                        self.session.rollback()
                        
            self.session.remove()
            return response_or_exc
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用sqlalchemy的declarative_base()函数来定义一个基类,然后通过继承这个基类来定义你的数据库表类。下面是一个简单的示例代码: ```python from sqlalchemy import Column, Integer, String, create_engine from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(50)) age = Column(Integer) engine = create_engine('sqlite:///example.db') Base.metadata.create_all(engine) ``` 在这个例子,我们先定义了一个基类`Base`,然后通过定义一个继承自`Base`的`User`类来定义一个数据库表类。`User`类的`__tablename__`属性指定了表名,`id`、`name`和`age`属性则对应了表的三个列。 最后,我们通过`create_engine()`函数创建了一个数据库引擎,然后调用`Base.metadata.create_all()`方法自动创建了对应的数据库表。 这样,你就可以通过实例化`User`类来进行数据库操作了,例如: ```python from sqlalchemy.orm import sessionmaker Session = sessionmaker(bind=engine) session = Session() user = User(name='Alice', age=18) session.add(user) session.commit() users = session.query(User).all() for user in users: print(user.id, user.name, user.age) ``` 这个例子,我们先通过`sessionmaker()`函数创建了一个数据库会话类`Session`,然后通过`Session()`方法创建了一个会话对象`session`。接着,我们实例化了一个`User`对象`user`并将其添加到会话,并通过`commit()`方法提交了事务。最后,我们通过`query()`方法查询所有用户并打印了其信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值