SQLAlchemy:flush()和commit()之间有什么区别?

SQLAlchemy中flush()commit()的区别是什么? 数据库

我已经阅读了文档,但没有更明智 - 他们彷佛假设我没有预先理解。 session

我对它们对内存使用的影响特别感兴趣。 我正在从一系列文件(总共约500万行)中将一些数据加载到数据库中,而且个人会话偶尔会崩溃 - 它是一个大型数据库和一台内存不足的机器。 this

我想知道我是否使用了太多的commit()和没有足够的flush()调用 - 可是若是没有真正理解差别是什么,那就很难说了! spa


#1楼

正如@snapshoe所说 code

flush()将您的SQL语句发送到数据库 对象

commit()提交事务。 事务

session.autocommit == False 内存

若是设置autoflush == True commit()将调用flush()rem

session.autocommit == True 文档

若是您还没有启动事务(您可能没有,由于您可能只使用此模式来避免手动管理事务),则没法调用commit() )。

在此模式下,必须调用flush()以保存ORM更改。 有效刷新也会提交您的数据。


#2楼

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')>]
相关文章
相关标签/搜索