我需要在core.event 'handle_error' (catch 'KeyboardInterrupt')
中回滚事务,但是此事件中的参数是ExceptionContext
,该怎么做?
答案 0 :(得分:3)
在使用sqlalchemy时,我通常具有这种模式:
session = get_the_session_one_way_or_another()
try:
# do something with the session
except: # * see comment below
session.rollback()
raise
else:
session.commit()
为使事情更易于使用,将其作为上下文管理器很有用:
@contextmanager
def get_session():
session = get_the_session_one_way_or_another()
try:
yield session
except:
session.rollback()
raise
else:
session.commit()
然后:
with get_session() as session:
# do something with the session
如果在该块中引发异常,则上下文管理器将回滚该事务。
*有一个空的except:
可以捕获所有内容。通常这不是您想要的,但是这里总是会引发异常,所以很好。