我在使用 sqlalchemy
时遇到缓存问题。
我使用 sqlalchemy
将数据插入 MySQL 数据库。然后,我让另一个应用程序处理这些数据,并直接更新它。
但是 sqlalchemy
总是返回旧数据而不是更新数据。我认为 sqlalchemy
缓存了我的请求……所以……我应该如何禁用它?
原文由 Zeyi Fan 发布,翻译遵循 CC BY-SA 4.0 许可协议
我在使用 sqlalchemy
时遇到缓存问题。
我使用 sqlalchemy
将数据插入 MySQL 数据库。然后,我让另一个应用程序处理这些数据,并直接更新它。
但是 sqlalchemy
总是返回旧数据而不是更新数据。我认为 sqlalchemy
缓存了我的请求……所以……我应该如何禁用它?
原文由 Zeyi Fan 发布,翻译遵循 CC BY-SA 4.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 许可协议
2 回答5.2k 阅读✓ 已解决
4 回答1.5k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
8 回答1.3k 阅读
3 回答1.2k 阅读✓ 已解决
人们认为除了事务本地的常用 SQLAlchemy 身份映射之外还有一个“缓存”在起作用的通常原因是他们正在观察事务隔离的影响。 SQLAlchemy 的会话默认在事务模式下工作,这意味着它会一直等到
session.commit()
被调用,以便将数据持久保存到数据库中。在此期间,其他地方正在进行的其他交易将看不到此数据。然而,由于交易的孤立性,还有一个额外的转折。那些正在进行的其他交易不仅在提交之前看不到您的交易数据,在某些情况下他们也看不到它,直到 _它们也被提交或回滚_(这与您的 close() 在这里产生的效果相同) .具有平均 隔离 度的事务将保留它到目前为止已加载的状态,并继续为您提供事务本地的相同状态,即使实际数据已更改——这在事务隔离用语中称为 可重复读取。
http://en.wikipedia.org/wiki/Isolation_%28database_systems%29