即使我在mysql中更新它,MySQL中的一行也不会改变

时间:2011-02-20 21:31:40

标签: python mysql database django

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)

出于某种原因,即使我在表中更新“next_decay_at”,这个Decay.objects.filter查询似乎也会被缓存,当我打印“next_decay_at”时,它似乎没有改变!它每次都打印相同。

当我重新启动脚本时,它似乎已更改并且print语句已更改。但是当我让它再次运行时,它会一遍又一遍地打印出来。可能是while循环正在缓存结果集吗?

3 个答案:

答案 0 :(得分:0)

了解Django的transaction handling

答案 1 :(得分:0)

QuerySet缓存结果。引用docs

  

在新创建的QuerySet中,缓存为空。第一次评估QuerySet - 并因此发生数据库查询 - Django将查询结果保存在QuerySet的缓存中并返回已明确请求的结果(例如,如果正在迭代QuerySet,则返回下一个元素)过度)。对QuerySet的后续评估将重用缓存的结果。

将您的代码更改为以下内容:

date_from = datetime.datetime.now()
for r in Decay.objects.filter(next_decay_at__lte=date_from):
    print r.next_decay_at

或使用iterator方法:

results = Decay.objects.filter(next_decay_at__lte=datetime.datetime.now())
for r in results.iterator():
    print r.next_decay_at

答案 2 :(得分:0)

您看到的行为与QuerySet无关。它与事务管理有关。当您的请求或脚本启动时,Django会打开一个事务,直到该事务提交或回滚,它才会在其他事务中间歇性地发生任何事情。

如果您提交事务并再次运行该代码块,则应获得更新结果。

from django.db import transaction
transaction.commit()