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

时间:2015-02-11 02:29:08

标签: python sqlalchemy

我对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. 或者完全反过来并在回滚交易之前删除会话?

1 个答案:

答案 0 :(得分:0)

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

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

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

    回滚一个例子:

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

    这一切都取决于你如何使用它,你的代码建议这是在flask会话中,这将是有效的。外面你需要一个不同的解决方案