0

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

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

autoflush 不意味着在多线程环境中与 scoped_session 一起运行吗?

4

1 回答 1

0

autoflush 不意味着在多线程环境中与 scoped_session 一起运行吗?

没有这样的限制,没有。

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

这是对自动刷新的误解。Autoflush 旨在在查询向数据库发出 SELECT 之前将待处理的数据刷新到数据库。但是,它不提供在对象的每个属性发生更改时立即刷新数据的功能,因为这将非常低效,并且对于任何类型的 ORM(无论是否为工作单元)都是不可行的。因此,如果您修改了一堆对象,然后丢弃 Session 而不与它进一步交互,那些未决的更改就会丢失。

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

于 2012-09-08T12:42:48.353 回答