当前位置:  开发笔记 > 编程语言 > 正文

如何禁用Django查询缓存?

如何解决《如何禁用Django查询缓存?》经验,为你挑选了3个好方法。

在我的Django应用程序中,我在我的数据库上重复运行相同的查询(例如每10秒).然后,我在我收到的查询集上创建MD5总和,并将其与我在上一次运行中创建的MD5总和进行比较.如果两者相等,则数据未更改,并且网页不需要更新.

当我这样做时,数据库中的数据可能会改变.

但是,查询返回相同的查询集,显然是由于查询缓存.

如何禁用查询缓存并在DB上明确执行查询?



1> Kekoa..:

我遇到了我认为是某种缓存的行为,但事实证明是数据库事务欺骗了我.

我遇到了问题,在另一个进程中,项目被添加到数据库中,我想监视其他进程的进度,所以我打开了一个django shell并发出以下命令:

>>> MyData.objects.count()
74674

>>> MyData.objects.count()
74674

值并没有改变,即使它实际上在数据库中.我意识到,至少我使用MySQL和django设置的方式是我在一个事务中,并且在我打开事务时只会看到数据库的"快照".

由于django中的视图,我定义了自动提交行为,因此每个视图只能看到快照,因为下次调用视图时,它将处于不同的事务中.但是对于一段未自动提交的代码,除了在此事务中进行的更改外,它不会看到数据库中的任何更改.

我想我会把这个答案扔给任何可能遇到这种情况的人.

要解决,请提交您的交易,这可以手动完成,如下所示:

>> from django.db import transaction
>> transaction.enter_transaction_management()
>> transaction.commit() # Whenever you want to see new data


非常感谢,我在运行一个侦听队列并且必须处理某些事件的命令时得到了这个确切的行为,当发生这种情况时,处理器将无法找到在命令开始运行后创建的用户

2> Daniel Rosem..:

查询缓存仅适用 QuerySet.换句话说,如果两次评估同一个queryset对象,查询缓存将运行.但是如果你每10秒进行一次查询,可能这是通过一个每次生成一个新进程的cron,所以Django没有办法缓存任何东西.

如果您重复执行完全相同的查询,则数据库自己的缓存可能会生效.您应该查看DBMS的文档,了解如何正确管理它.



3> Amos..:

您提供给Django文档的链接意味着以下内容:

>>> print [e.headline for e in Entry.objects.all()]
>>> print [e.pub_date for e in Entry.objects.all()]

为数据库创建两个查询,同时:

>>> queryset = Poll.objects.all()
>>> print [p.headline for p in queryset] # Evaluate the query set.
>>> print [p.pub_date for p in queryset] # Re-use the cache from the evaluation.

当您访问相同的评估结果时,使用查询缓存.

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有