我目前正在使用sqlalchemy提供的scoped_session,autocommit = True,autoflush = True。
我注意到autoflush没有被正确调用,因为当我的脚本完成执行时,某些更新的结果没有被刷新。
autoflush是不是要在多线程环境中使用scoped_session运行?
答案 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 避免自动提交的强烈建议。