Python MySQL中的一行不会改变,即使我在MySQL中更新了它
出于某种原因,即使我在表中更新了next_detaci_at,这个detaci.objects.filter查询似乎被缓存了,当我打印next_detaci_at时,它似乎没有改变!每次都是一样的Python MySQL中的一行不会改变,即使我在MySQL中更新了它,python,mysql,database,django,Python,Mysql,Database,Django,出于某种原因,即使我在表中更新了next_detaci_at,这个detaci.objects.filter查询似乎被缓存了,当我打印next_detaci_at时,它似乎没有改变!每次都是一样的 当我重新启动脚本时,它似乎已经改变,print语句也改变了。但当我让它再次运行时,它会一遍又一遍地打印相同的内容。是否while循环正在缓存结果集?了解Django的相关信息。QuerySet缓存结果。引述: 在新创建的QuerySet中,缓存为空。第一次计算QuerySet时——因此,发生数据库查询
当我重新启动脚本时,它似乎已经改变,print语句也改变了。但当我让它再次运行时,它会一遍又一遍地打印相同的内容。是否while循环正在缓存结果集?了解Django的相关信息。QuerySet缓存结果。引述: 在新创建的QuerySet中,缓存为空。第一次计算QuerySet时——因此,发生数据库查询时——Django将查询结果保存在QuerySet的缓存中,并返回显式请求的结果,例如,如果对QuerySet进行迭代,则返回下一个元素。查询集的后续求值将重用缓存的结果
results = Decay.objects.filter(next_decay_at__lte=datetime.datetime.now())
for r in results.iterator():
print r.next_decay_at
将代码更改为以下内容:
if __name__ == "__main__":
while True:
results = None
results = Decay.objects.filter(next_decay_at__lte=datetime.datetime.now())
for r in results:
print r.next_decay_at
time.sleep(10)
或使用方法:
你看到的行为与QuerySet无关。它与事务管理有关。当您的请求或脚本启动时,Django会打开一个事务,在该事务提交或回滚之前,它不会获得其他事务中间歇性发生的任何内容 如果您提交事务并再次运行该代码块,您应该会得到更新的结果
results = Decay.objects.filter(next_decay_at__lte=datetime.datetime.now())
for r in results.iterator():
print r.next_decay_at
我在Mysql中查询它,从中选择下一个值。。。它改变了!!!但不是在这个脚本期间。它不断重复打印相同的内容,直到我重新启动脚本。ok。读一下。我不做手动提交或其他任何事情。这只是一个基本的。保存。另一个脚本每隔一段时间就会这样做。为了未来搜索者的利益:这不是正确的答案。OP发布的代码中没有任何内容会导致缓存,将datetime.now的计算移动到单独的变量不会改变任何内容。我不同意。在OP中,代码记录缓存在内部QuerySet缓存中,而不是由django.core.cache缓存。请阅读我链接到的文档。我已移出datatime以保留代码功能,例如仅初始化一次日期。
from django.db import transaction
transaction.commit()