SQLAlchemy中flush()
和commit()
的区别是什么? 数据库
我已经阅读了文档,但没有更明智 - 他们彷佛假设我没有预先理解。 session
我对它们对内存使用的影响特别感兴趣。 我正在从一系列文件(总共约500万行)中将一些数据加载到数据库中,而且个人会话偶尔会崩溃 - 它是一个大型数据库和一台内存不足的机器。 this
我想知道我是否使用了太多的commit()
和没有足够的flush()
调用 - 可是若是没有真正理解差别是什么,那就很难说了! spa
正如@snapshoe所说 code
flush()
将您的SQL语句发送到数据库 对象
commit()
提交事务。 事务
session.autocommit == False
: 内存
若是设置autoflush == True
commit()
将调用flush()
。 rem
当session.autocommit == True
: 文档
若是您还没有启动事务(您可能没有,由于您可能只使用此模式来避免手动管理事务),则没法调用commit()
)。
在此模式下,必须调用flush()
以保存ORM更改。 有效刷新也会提交您的数据。
Session对象基本上是对数据库的更改(更新,插入,删除)的持续事务。 这些操做在提交以前不会持久保存到数据库中(若是您的程序在会话中间事务中因为某种缘由而停止,则会丢失任何未提交的更改)。
会话对象使用session.add()
注册事务操做,但在调用session.flush()
以前还没有将它们传递给数据库。
session.flush()
将一系列操做传递给数据库(插入,更新,删除)。 数据库将它们维护为事务中的挂起操做。 在数据库收到当前事务的COMMIT(这就是session.commit()
所作的事情session.commit()
以前,更改不会永久保留到磁盘或对其余事务可见。
session.commit()
将这些更改提交(持久)到数据库。
flush()
始终做为对commit()
( 1 )的调用的一部分进行调用。
当您使用Session对象查询数据库时,查询将返回数据库和它所拥有的未提交事务的刷新部分的结果。 默认状况下,会话对象会自动autoflush
其操做,但能够禁用此操做。
但愿这个例子能让我更清楚:
#--- s = Session() s.add(Foo('A')) # The Foo('A') object has been added to the session. # It has not been committed to the database yet, # but is returned as part of a query. print 1, s.query(Foo).all() s.commit() #--- s2 = Session() s2.autoflush = False s2.add(Foo('B')) print 2, s2.query(Foo).all() # The Foo('B') object is *not* returned # as part of this query because it hasn't # been flushed yet. s2.flush() # Now, Foo('B') is in the same state as # Foo('A') was above. print 3, s2.query(Foo).all() s2.rollback() # Foo('B') has not been committed, and rolling # back the session's transaction removes it # from the session. print 4, s2.query(Foo).all() #--- Output: 1 [<Foo('A')>] 2 [<Foo('A')>] 3 [<Foo('A')>, <Foo('B')>] 4 [<Foo('A')>]