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

在我执行此操作时,数据库中的数据可能会更改.

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

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

推荐答案

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

我遇到了这样的问题,在另一个进程中,项被添加到数据库中,我想监视另一个进程的进度,所以我打开了一个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

Database相关问答推荐

使用 Npgsql 执行年龄查询并在 .NET 应用程序中返回结果?

是否可以同时从 RocksDB 读取?

优雅地处理 EJB/JPA 环境中的约束冲突?

多列上的全文索引如何工作?

递归关系的数据库设计

Symfony2:spl_object_hash() expects parameter 1 to be object, string given in Doctrine

WAMP 的 MySQL 数据库文件位于何处?

存储所有排列的模式数据库

在 MySQL 中查看表以进行更改?

将数据库表用作作业(job)队列的最佳方式是什么?

我应该不断地open()和close() SQL 数据库还是让它保持打开状态?

更改列类型而不丢失数据

为什么有人需要内存数据库?

多语言数据库,默认回退

Slick 3.0 在数据库驱动程序级别是reactive/asynchronous的吗?对于哪些数据库?

XML、CSV 或数据库格式的 ICD-9 代码列表

为什么负 id 或零被认为是不好的做法?

将查询限制为一条记录会提高性能吗

与内连接相反

Guice、JDBC 和管理数据库连接