flask-sqlalchemy 默认是开始事务的,那么如何标记一组操作为一个 transaction 要么全成功要么全失败?

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

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:[email protected]/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)

最佳答案

我本地试了下,并没有啥问题:
image.png

\# todo: test  
try:  
    db.session.add(User("111", 1))  
    db.session.add(User("222", 2))  
    db.session.add(User("111", 3))  
    db.session.commit()  
except Exception as e:  
    db.session.rollback()  
    raise e