2015-02-11 62 views
1

我对SQLAlchemy关于事务的术语感到有点困惑 - 似乎有DB级事务和会话级事务。什么是SQLAlchemy事务vs会话的正确顺序?

我目前的理解: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. 或者完全以其他方式完成并在回滚事务之前删除会话?

回答

0

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

  1. create_scoped_session实际上是一个flask-sqlalchemy扩展,但在后台它使用标准的SQLAlchemy会话创建代码。所以你在这里使用两个。
  2. 您应该忽略这些事务,SQLAlchemy会为您处理这些事务。像SQLAlchemy这样的抽象层的优点是,它甚至可以在没有事务支持的情况下在数据库上工作(达到一定水平)。
  3. 就让烧瓶SQLAlchemy的为您处理彻底,这里是一个例子与承诺:

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

    和示例回滚:

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

    这一切都取决于你如何使用它虽然,你的代码表明这是在flask会话中,这将工作。外部你需要一个不同的解决方案

+0

感谢您的答案 - 您提到的范围会话给了我更好地理解SQLA会话的线索。我正在使用的示例代码实际上是[加入外部事务的SQLalchemy模式]的示例(http://docs.sqlalchemy.org/en/latest/orm/session_transaction.html#joining-a-session-into -an-外部事务例如-作为换测试套件)。对于这种模式,显式管理会话/事务交互似乎很重要。这个[Flask-SQLAlchemy问题](https://github.com/mitsuhiko/flask-sqlalchemy/issues/243)链接到一个博客文章,更多信息。 – 2015-02-16 22:02:38

相关问题