【问题标题】:What is the proper order of SQLAlchemy transactions vs sessions?SQLAlchemy 事务与会话的正确顺序是什么?
【发布时间】:2015-02-12 06:12:17
【问题描述】:

我对 SQLAlchemy 关于事务的术语感到有些困惑——似乎既有 DB 级事务又有会话级事务。

我目前的理解: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. 或者完全相反,在回滚事务之前删除会话?

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

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

    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 会话中起作用的。在外面你需要一个不同的解决方案

    【讨论】:

    猜你喜欢
    • 2021-01-08
    • 2012-11-10
    • 2015-07-01
    • 2012-08-16
    • 2021-06-01
    • 1970-01-01
    • 2012-04-13
    • 2017-06-28
    • 2019-09-06
    相关资源
    最近更新 更多