关闭SQLAlchemy ORM会话是否回滚未提交的更改?

时间:2017-10-18 04:18:47

标签: python sql transactions sqlalchemy

例如,以下两个之间是否存在差异?

session = Session() # Session is a session maker
try:
    # do some work
    session.commit()
except:
    session.rollback()
finally:
    session.close()

session = Session()
try:
    # do some work
    session.commit()
finally:
    session.close()

后者是我以前做的,因为我假设在提交之前关闭会话(如果出现错误)与回滚具有相同的效果。但我看到了第一个表格here

1 个答案:

答案 0 :(得分:4)

Closing会话将隐式回滚当前的事务状态:

  

close()方法会发布expunge_all()releases任何事务/连接资源。当连接返回到连接池时,也会回滚事务状态。

但我认为第一种形式仍然更好,因为explicit is better than implicit。 SQLAlchemy的作者也是seems to reflect this sentiment