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()
如您所见,目前我在创建事务后创建了一个作用域会话,但在删除会话之前回滚事务。
问题:
- 我在这里创建的事务是会话级事务还是数据库级事务?
- 我应该交换这些以便在范围会话内创建事务吗?
- 或者完全相反,在回滚事务之前删除会话?
您基本上可以将会话视为一个超级事务,在一个会话中您可以打开和关闭多个事务(虽然一次只能打开一个事务)以读写数据。
create_scoped_session
实际上是一个flask-sqlalchemy扩展,但是在后台它使用标准的SQLAlchemy会话创建代码。所以你在这里同时使用了两者。
- 您应该忽略事务,SQLAlchemy 会为您处理这些事务。像 SQLAlchemy 这样的抽象层的优点是它甚至可以在没有事务支持的数据库上工作(达到一定程度)。
让 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
会话中可以正常工作的。在外面你需要一个不同的解决方案
我对 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()
如您所见,目前我在创建事务后创建了一个作用域会话,但在删除会话之前回滚事务。
问题:
- 我在这里创建的事务是会话级事务还是数据库级事务?
- 我应该交换这些以便在范围会话内创建事务吗?
- 或者完全相反,在回滚事务之前删除会话?
您基本上可以将会话视为一个超级事务,在一个会话中您可以打开和关闭多个事务(虽然一次只能打开一个事务)以读写数据。
create_scoped_session
实际上是一个flask-sqlalchemy扩展,但是在后台它使用标准的SQLAlchemy会话创建代码。所以你在这里同时使用了两者。- 您应该忽略事务,SQLAlchemy 会为您处理这些事务。像 SQLAlchemy 这样的抽象层的优点是它甚至可以在没有事务支持的数据库上工作(达到一定程度)。
让 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
会话中可以正常工作的。在外面你需要一个不同的解决方案