Session对象基本上是对数据库的更改的持续事务(更新,插入,删除)。这些操作不会保留到数据库中,直到它们提交(如果您的程序因某种原因在会话中期事务中中止,则任何未提交的更改都会丢失)。
会话对象使用session.add()注册事务操作,但是在调用session.flush()之前还没有将它们传递到数据库。
session.flush()将一系列操作传递给数据库(插入,更新,删除)。数据库将它们维护为事务中的待处理操作。这些更改不会永久保留到磁盘,或对其他事务可见,直到数据库接收到当前事务的COMMIT(这是session.commit()所执行的操作)。
session.commit()提交(持久)这些更改到数据库。
flush()总是作为对commit()(1)的调用的一部分来调用。
当使用Session对象查询数据库时,查询将返回来自数据库和来自其保存的未提交事务的刷新部分的结果。默认情况下,Session对象自动刷新其操作,但可以禁用。
希望这个例子将使这个更清楚:
#---
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 []
2 []
3 [, ]
4 []