Sqlalchemy session.flush与线程

时间:2012-09-08 07:40:09

标签: python sqlalchemy

我目前正在使用sqlalchemy提供的scoped_session,autocommit = True,autoflush = True。

我注意到autoflush没有被正确调用,因为当我的脚本完成执行时,某些更新的结果没有被刷新。

autoflush是不是要在多线程环境中使用scoped_session运行?

1 个答案:

答案 0 :(得分:0)

  

autoflush是不是要在多线程环境中使用scoped_session运行?

没有这样的限制,没有。

  

我注意到autoflush没有被正确调用,因为当我的脚本完成执行时,某些更新的结果没有被刷新。

这是对autoflush的误解。 Autoflush旨在在查询向数据库发出SELECT之前将挂起的数据刷新到数据库。然而,它没有提供特征,即当对象的每个属性被改变时立即刷新数据,因为这将是非常低效的并且对于任何类型的ORM,工作单元是否不可行。因此,如果你修改了一堆对象,然后扔掉会话而不与它进一步交互,那些挂起的更改就会丢失。

Autoflush旨在用于交易的上下文中。在默认的使用模式下,Session为您开始一个事务,只有在准备好一系列更改时才需要调用commit()。请参阅背景文档http://docs.sqlalchemy.org/en/rel_0_7/orm/session.html#flushing以及http://docs.sqlalchemy.org/en/rel_0_7/orm/session.html#autocommit-mode 避免自动提交的强烈建议。