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

lfk*_*lfk 3 python sql transactions sqlalchemy

例如,以下两个之间有区别吗?

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

session = Session()
try:
    # do some work
    session.commit()
finally:
    session.close()
Run Code Online (Sandbox Code Playgroud)

后者是我过去的工作,因为我假设在提交之前关闭会话(如果发生错误)与回滚具有相同的效果。但是我在这里看到了第一种形式。

Ilj*_*ilä 6

关闭会话将隐式回滚当前事务状态:

close()方法发出expunge_all(),并释放所有事务/连接资源。当连接返回到连接池时,事务状态也会回滚。

但是我认为第一种形式仍然更好,因为显式要比隐式好。SQLAlchemy的作者似乎也反映了这种观点

  • @DineshPundkar 显式优于隐式应该根据具体情况进行分析。例如,您可能会发现每次使用函数时都指定该函数的所有默认参数并不可取。想象一下如果这样做的话打印语句会是什么样子? (2认同)