除非您了解什么是数据库事务,否则现有的答案没有多大意义。 (直到最近我都是这样。)
有时您可能希望运行多个 SQL 语句并让它们成功或失败作为一个整体。例如,如果您想执行从账户 A 到账户 B 的银行转账,您需要执行两个查询,例如
UPDATE accounts SET value = value - 100 WHERE acct = 'A'
UPDATE accounts SET value = value + 100 WHERE acct = 'B'
如果第一个查询成功但第二个查询失败,这很糟糕(原因很明显)。因此,我们需要一种“整体”处理这两个查询的方法。解决方案是从 BEGIN 语句开始,以 COMMIT 语句或 ROLLBACK 语句结束,例如
BEGIN
UPDATE accounts SET value = value - 100 WHERE acct = 'A'
UPDATE accounts SET value = value + 100 WHERE acct = 'B'
COMMIT
这是单笔交易。
在 SQLAlchemy 的 ORM 中,这可能看起来像
# BEGIN issued here
acctA = session.query(Account).get(1) # SELECT issued here
acctB = session.query(Account).get(2) # SELECT issued here
acctA.value -= 100
acctB.value += 100
session.commit() # UPDATEs and COMMIT issued here
如果您监控何时执行各种查询,您将看到更新不会到达数据库,直到您调用session.commit()。
在某些情况下,您可能希望在发出 COMMIT 之前执行 UPDATE 语句。 (也许数据库向对象发出一个自动递增的 id 并且您想在提交之前获取它)。在这些情况下,您可以显式地flush() 会话。
# BEGIN issued here
acctA = session.query(Account).get(1) # SELECT issued here
acctB = session.query(Account).get(2) # SELECT issued here
acctA.value -= 100
acctB.value += 100
session.flush() # UPDATEs issued here
session.commit() # COMMIT issued here