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

Python SQLAlchemy事务与会话的正确顺序是什么?,python,sqlalchemy,Python,Sqlalchemy,SQLAlchemy关于事务的术语让我有点困惑——似乎有DB级事务和会话级事务 我目前的理解:会话(会话级事务(db-leveltransactions()) 我将事务与作用域会话一起用作测试夹具的一部分。我启动一个事务,创建数据并查看测试是否通过,然后在下一个测试之前回滚该事务 这是我的密码: connection = db.engine.connect() transaction = connection.begin() options = dict(bind=connection, bin

SQLAlchemy关于事务的术语让我有点困惑——似乎有DB级事务和会话级事务

我目前的理解:
会话(会话级事务(db-leveltransactions())

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

这是我的密码:

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() 
如您所见,目前我在创建事务之后创建了一个作用域会话,但在删除该会话之前回滚了该事务

问题:

  • 我在这里创建的事务是会话级事务还是数据库级事务
  • 我是否应该交换这些,以便在作用域会话内创建事务
  • 或者完全相反,在回滚事务之前删除会话

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

  • create\u scoped\u session
    实际上是一个flask sqlalchemy扩展,但在后台它使用标准的sqlalchemy session创建代码。所以你在这里都用
  • 您应该忽略事务,SQLAlchemy会为您处理这些事务。像SQLAlchemy这样的抽象层的优点是,它甚至可以在没有事务支持的数据库上工作(达到某个级别)
  • 让Alchemy完全为您处理,下面是一个提交的示例:

    your_object = YourObject(...)
    db.session.add(your_object)
    db.session.commit()
    
    还有一个回滚示例:

    your_object = YourObject(...)
    db.session.add(your_object)
    db.session.rollback()
    
    不过,这完全取决于您如何使用它,您的代码表明这是在
    flask
    会话中进行的。在外面,你需要一个不同的解决方案

  • 感谢您的回答——您提到的范围会话为我提供了更好地理解SQLA会话的线索。我使用的示例代码实际上是。对于这种模式,显式管理会话/事务交互似乎很重要。此链接指向包含更多信息的博客文章。