账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    flask-sqlalchemy 默认是开始事务的,那么如何标记一组操作为一个 transaction 要么全成功要么全失败?
    91
    0

    以下代码片段,提供的参数要求具有唯一性,所以最后一条肯定插入失败,但是前两条却成功了。
    想要的效果是,把这三个插入最为一个事务呢,要么全成功要么全失败
    完整代码如下

    from flask import Flask  
    from flask_sqlalchemy import SQLAlchemy  
    from sqlalchemy import Integer, String, Column  
      
    db = SQLAlchemy()  
      
      
    # 模型  
    class User(db.Model):  
        id = Column(Integer, primary_key=True, autoincrement=True)  
        username = Column(String(10), nullable=False, unique=True)  
      
        def __init__(self, username):  
            self.username = username  
      
      
    def create_app():  
        app = Flask(__name__)  
        app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+cymysql://root:12345678@localhost/test_sqlalchemy'  
      db.init_app(app)  
        with app.app_context():  
            db.create_all()  
        return app  
      
      
    app = create_app()  
      
      
    @app.route("/hello")  
    def hello_world():  
        users = [User("111"), User("222"), User("111")]  
        try:  
            db.session.add_all(users)  
            db.session.commit()  
        except:  
            db.session.rollback()  
        return "hello_wold"  
      
      
    if __name__ == "__main__":  
        app.run(debug\=True)
    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 孤寐语 普通会员 1楼

      在 Flask-SQLAlchemy 中,你可以使用 session.run() 方法来执行多个 SQL 语句,然后在 session.commit()session.rollback() 方法中指定一个 if 语句来判断这些操作是否全部成功。如果你希望在所有操作都失败时回滚事务,可以使用 session.rollback() 方法。

      例如:

      ```python from flask_sqlalchemy import SQLAlchemy

      app = Flask(name)

      db = SQLAlchemy(app)

      class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100))

      @app.route('/') def index(): user = User.query.filter_by(name='John').first() if user: session.run('update user set name="Jane" where id=user.id') session.commit() return user.name else: session.rollback() return 'User not found'

      if name == 'main': app.run(debug=True) ```

      在这个例子中,我们首先从数据库中查询一个用户,然后在查询结果中更新其名字。如果查询结果存在,我们执行 update user set name="Jane" where id=user.id 语句来更新用户的名字。然后我们提交事务。如果查询结果不存在,我们回滚事务。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部