SQLAlchemy 事务与会话的正确顺序是什么?

What is the proper order of SQLAlchemy transactions vs sessions?

我对 SQLAlchemy 关于事务的术语有点困惑——似乎既有数据库级事务也有会话级事务。

我目前的理解:Sessions(session-level transactions(db-level transactions()))

我将事务和作用域会话一起用作测试夹具的一部分。我发起一个事务,创建数据并查看测试是否通过,然后在下一次测试之前回滚事务。

这是我的代码:

connection = db.engine.connect()
transaction = connection.begin()
options = dict(bind=connection, binds={})
db.session = db.create_scoped_session(options=options)
yield db.session
transaction.rollback()
connection.close()
db.session.remove() 

如您所见,目前我在创建事务后创建了一个作用域会话,但在删除会话之前回滚事务。

问题:

  1. 我在这里创建的事务是会话级事务还是数据库级事务?
  2. 我应该交换这些以便在范围会话内创建事务吗?
  3. 或者完全相反,在回滚事务之前删除会话?

您基本上可以将会话视为一个超级事务,在一个会话中您可以打开和关闭多个事务(虽然一次只能打开一个事务)以读写数据。

  1. create_scoped_session实际上是一个flask-sqlalchemy扩展,但是在后台它使用标准的SQLAlchemy会话创建代码。所以你在这里同时使用了两者。
  2. 您应该忽略事务,SQLAlchemy 会为您处理这些事务。像 SQLAlchemy 这样的抽象层的优点是它甚至可以在没有事务支持的数据库上工作(达到一定程度)。
  3. 让 flask-sqlalchemy 完全为你处理,这里有一个提交的例子:

    your_object = YourObject(...)
    db.session.add(your_object)
    db.session.commit()
    

    还有一个回滚的例子:

    your_object = YourObject(...)
    db.session.add(your_object)
    db.session.rollback()
    

    虽然这完全取决于您如何使用它,但您的代码表明这是在 flask 会话中可以正常工作的。在外面你需要一个不同的解决方案