SQLAlchemy中flush和commit的区别

commit()会先调用flush()清理缓存,然后提交事务;
flush()只清理缓存,不提交事务

Commit操作比较好理解,就是提交一次事务Transaction操作。既然是提交一次事务操作,就包含了增删改的SQL操作。所以必然是Session通过Connection进行写磁盘I/O的操作。
Flush不同的是,它并没有真正的执行事务Transaction的操作,而是更新了数据库的事务缓存[1]。所以Flush是会和数据库进行通信的。Flush操作告知数据库把事务操作缓存在数据库,直到数据库收到了Commit操作之后才会真正将操作更新到磁盘中[5]。
You may flush() as often as you like within a transaction to move changes from Python to the database’s transaction buffer.

Flush方法会生成Primary Key,所以哪怕Flush之后并不进行Commit操作,Primary Key也还是会生成。所以下一次Insert一条记录时,Primary Key会再次加1.
通常如果我们希望在Commit之前获取到待插入数据的自增主键,那我们可以在Commit之前进行Flush操作。这时SQLAlchemy的对象就会获取到数据库生成待对应数据行的主键值[4]。
Session在进行查询时(查询操作之前)会进行一次Flush操作。所以创建了对象,虽然并没有提交,但是紧接着进行Query操作也能在当前Session中查询到这个对象[2]。

Flush之后就能在当前Session中看到效果,而Commit之后才能在其他Session中看到效果[3]。

总结:
1. flush会生成primary key
2. 当前紧接着的session可以查到flush做的增删改的结果
3. 其他session只有在commit之后,才能查到flush做的增删改结果

 

参考链接:

https://www.cnblogs.com/zhanghaibin16/p/13271672.html?utm_source=tuicool

原文地址:https://www.cnblogs.com/neozheng/p/14149960.html