在我的Django应用程序中,我在我的数据库上重复运行相同的查询(例如每10秒).然后,我在我收到的查询集上创建MD5总和,并将其与我在上一次运行中创建的MD5总和进行比较.如果两者相等,则数据未更改,并且网页不需要更新.
当我这样做时,数据库中的数据可能会改变.
但是,查询返回相同的查询集,显然是由于查询缓存.
如何禁用查询缓存并在DB上明确执行查询?
我遇到了我认为是某种缓存的行为,但事实证明是数据库事务欺骗了我.
我遇到了问题,在另一个进程中,项目被添加到数据库中,我想监视其他进程的进度,所以我打开了一个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
查询缓存仅适用于 QuerySet.换句话说,如果两次评估同一个queryset对象,查询缓存将运行.但是如果你每10秒进行一次查询,可能这是通过一个每次生成一个新进程的cron,所以Django没有办法缓存任何东西.
如果您重复执行完全相同的查询,则数据库自己的缓存可能会生效.您应该查看DBMS的文档,了解如何正确管理它.
您提供给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.
当您访问相同的评估结果时,使用查询缓存.