如何禁用 SQLAlchemy 缓存?

新手上路,请多包涵

我在使用 sqlalchemy 时遇到缓存问题。

我使用 sqlalchemy 将数据插入 MySQL 数据库。然后,我让另一个应用程序处理这些数据,并直接更新它。

但是 sqlalchemy 总是返回旧数据而不是更新数据。我认为 sqlalchemy 缓存了我的请求……所以……我应该如何禁用它?

原文由 Zeyi Fan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

人们认为除了事务本地的常用 SQLAlchemy 身份映射之外还有一个“缓存”在起作用的通常原因是他们正在观察事务隔离的影响。 SQLAlchemy 的会话默认在事务模式下工作,这意味着它会一直等到 session.commit() 被调用,以便将数据持久保存到数据库中。在此期间,其他地方正在进行的其他交易将看不到此数据。

然而,由于交易的孤立性,还有一个额外的转折。那些正在进行的其他交易不仅在提交之前看不到您的交易数据,在某些情况下他们也看不到它,直到 _它们也被提交或回滚_(这与您的 close() 在这里产生的效果相同) .具有平均 隔离 度的事务将保留它到目前为止已加载的状态,并继续为您提供事务本地的相同状态,即使实际数据已更改——这在事务隔离用语中称为 可重复读取

http://en.wikipedia.org/wiki/Isolation_%28database_systems%29

原文由 zzzeek 发布,翻译遵循 CC BY-SA 3.0 许可协议

这个问题一直让我很沮丧,但我终于弄明白了。

我有一个 Flask/SQLAlchemy 应用程序与一个旧的 PHP 站点一起运行。 PHP 站点将写入数据库,而 SQLAlchemy 不会知道任何更改。

我尝试了 sessionmaker 设置 autoflush=True,但未成功 我在查询之前尝试了 db_session.flush()、db_session.expire_all() 和 db_session.commit(),但没有成功。仍然显示陈旧的数据。

最后我看到了 SQLAlchemy 文档的这一部分:http: //docs.sqlalchemy.org/en/latest/dialects/postgresql.html#transaction-isolation-level

设置 isolation_level 效果很好。现在我的 Flask 应用程序正在与 PHP 应用程序“对话”。这是代码:

 engine = create_engine(
    "postgresql+pg8000://scott:tiger@localhost/test",
    isolation_level="READ UNCOMMITTED"
)

当 SQLAlchemy 引擎以“READ UNCOMMITED”隔离级别启动时,它将执行“脏读”,这意味着它将直接从数据库中读取未提交的更改。

希望这可以帮助


这是 AaronD 在评论中提供的可能解决方案

from flask.ext.sqlalchemy import SQLAlchemy

class UnlockedAlchemy(SQLAlchemy):
    def apply_driver_hacks(self, app, info, options):
        if "isolation_level" not in options:
            options["isolation_level"] = "READ COMMITTED"
    return super(UnlockedAlchemy, self).apply_driver_hacks(app, info, options)

原文由 Nick Woodhams 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题