我们需要显式地执行session.begin()吗?

时间:2012-10-11 09:37:02

标签: python sqlalchemy

具体来说,在提交或回滚后是否需要调用begin?我看到有人建议新会话始终进入 begin状态;但我想知道会议开始时发生的自动提交事务。

我必须何时发出begin?同一会话中的多个begin行为与MySQL终端中的行为相同吗?

我有案例(看评论):

- 1在循环中执行事务的方法:

for ...: #EACH ONE DESERVES TO HAVE OWN TRANSACTION
  session.begin()
  for ....:
    session.execute("insert into...")
  session.commit()

- 2在同一会话中调用另一个函数的函数:

def f1(): #can be done standalone
  session = Session()
  session.begin()
  ...do stuff
  session.commit()

def f2():
  session = Session()
  session.begin()
  a = session.execute("select...")
  if stuff_not_fine():
    session.rollback() #KILL OF CURRENT TRANSACTION
    f1()
    session.begin() #CONTINUE WHERE IT LEFT
  a = session.execute("select...")
  ...do rest of stuff   

1 个答案:

答案 0 :(得分:0)

SQL连接也是一个上下文管理器。所以你可以做到

session = Session()
with session as cursor:
    # do stuff

为了进行漫游,您可能会引入一个异常,如果引发该异常,则会导致上下文管理器回滚事务。但是,您应该记住捕获异常。