Django ORM查询无法选择新对象

时间:2011-08-11 14:55:44

标签: python mysql django orm

设定:

  • Python脚本 A 每轮15分钟向数据库插入数据
  • Python脚本 B 每隔几分钟查询最后5个条目

两者都使用django的ORM,相同的MySQL数据库和相同的数据库用户帐户(相同的settings.py文件)

问题:
B 只能获取在运行之前插入的条目。好像 B 正在使用冻结的数据库运行时, B 首先冻结,然后首先连接到数据库。

为什么? 我可以在django中控制这种行为吗?

3 个答案:

答案 0 :(得分:9)

如果您正在重复使用相同的Manager对象,则必须牢记it's caching。要解决这个问题,你必须手动更新。

这将在每次迭代中返回相同的结果:

while True:
   same_every_time = AClass.objects.all().order_by('-id')[:5]
   sleep(300)

为了使其正常工作,您必须添加更新:

while True:
   AClass.objects.update()
   updated_results = AClass.objects.all().order_by('-id')[:5]
   sleep(300)

答案 1 :(得分:0)

Django本身使用了一种容器管理的持久性。这意味着数据库事务在上游响应级联期间由中间件提交。

如果您自己使用Django ORM,则应确保实际提交交易:

from django.db import transaction

def my_task(whatever):
    MyModel.objects.create(...)
    # do whatever
    transaction.commit()
    return 'my_result'

答案 2 :(得分:0)

我在尝试用 Django测试解决类似情况时发现了这个stackoverflow问题:在测试中,我修改了Django模型对象,但是这些更改没有反映在数据库中以便数据库读取器在第二个线程中可以检测到更改。解决方案是从TransactionTestCase继承我的测试类,而不是默认的django.test.TestCase。