Kek*_*koa 41
我遇到了我认为是某种缓存的行为,但事实证明是数据库事务欺骗了我.
我遇到了问题,在另一个进程中,项目被添加到数据库中,我想监视其他进程的进度,所以我打开了一个django shell并发出以下命令:
>>> MyData.objects.count()
74674
>>> MyData.objects.count()
74674
Run Code Online (Sandbox Code Playgroud)
值并没有改变,即使它实际上在数据库中.我意识到,至少我使用MySQL和django设置的方式是我在一个事务中,并且在我打开事务时只会看到数据库的"快照".
由于django中的视图,我定义了自动提交行为,因此每个视图只能看到快照,因为下次调用视图时,它将处于不同的事务中.但是对于一段未自动提交的代码,除了在此事务中进行的更改外,它不会看到数据库中的任何更改.
我想我会把这个答案扔给任何可能遇到这种情况的人.
要解决,请提交您的交易,这可以手动完成,如下所示:
>> from django.db import transaction
>> transaction.enter_transaction_management()
>> transaction.commit() # Whenever you want to see new data
Run Code Online (Sandbox Code Playgroud)
查询缓存仅适用于 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()]
Run Code Online (Sandbox Code Playgroud)
为数据库创建两个查询,同时:
>>> 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.
Run Code Online (Sandbox Code Playgroud)
当您访问相同的评估结果时,使用查询缓存.