【问题标题】:How to configure SQLAlchemy session.flush() periodically如何定期配置 SQLAlchemy session.flush()
【发布时间】:2018-05-19 09:29:47
【问题描述】:

有没有办法在创建会话对象时,可以将其配置为定期执行 flush()?

我需要这个功能的原因是因为在会话范围内,它正在内存中运行一个非短后台作业。我希望程序使用 flush() 定期更新与 DB 的作业进度,以便我的客户端可以从 DB 查询进度。

目前,我的解决方案是使用另一个定期执行 session.flush() 的线程。

谢谢!

【问题讨论】:

  • 您应该致电commit() 让其他客户看到您的更改; flush() 也有效的事实是您使用的隔离级别的副作用。为了实现您的目标,每当您想报告工作进度时,请更新您的模型并提交;不需要单独的线程。
  • 感谢您提出commit()。经过一些试验,我发现我的会话中的事务级别是 REPEATABLE READ,但我的客户端仍然可以读取未提交的更新。你知道为什么会这样吗?
  • 您要么打开了autoflush 并正在触发自动刷新,要么打开了autocommit

标签: python session sqlalchemy flush


【解决方案1】:

您无需在代码中一次又一次地调用session.flush()。默认情况下,SqlAlchmey autoflush 设置为 True。这意味着任何更新、删除、插入操作都已添加到事务以进行提交。因此,对 DB 的任何查询始终会获取最新数据,因为它不是工作单元模式,即使触发了选择查询,也应首先提交未提交的更改。

In [8]: session.autoflush
Out[8]: True

In [9]: session.autocommit
Out[9]: False

【讨论】:

  • 所以 autoflush() 触发 session.flush()。在sesson.flush()被触发之前,任何更新、删除、插入操作都不会被添加到事务中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多