SQLAlchemy-发生异常时回滚

时间:2018-09-08 07:19:51

标签: python sqlalchemy

我需要在core.event 'handle_error' (catch 'KeyboardInterrupt')中回滚事务,但是此事件中的参数是ExceptionContext,该怎么做?

1 个答案:

答案 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:可以捕获所有内容。通常这不是您想要的,但是这里总是会引发异常,所以很好。