【问题标题】:Django model retrieves same resultsDjango 模型检索相同的结果
【发布时间】:2012-11-25 21:20:49
【问题描述】:

我有一个基于 SQL 数据库的 django 模型 TestModel。

只要我这样做

TestModel.objects.all()

如果我从同一个进程多次运行它,我似乎得到了相同的结果。我测试了通过手动删除(不使用任何 django 原语)从构建模型的表中的一行,查询仍然返回相同的结果,即使删除后显然应该有更少的对象。

是否有某种缓存机制,每次我想检索对象时 django 都不会进入数据库?

如果有,有没有办法我仍然可以强制 django 在每次查询时访问数据库,最好不编写原始 SQL 查询?

我还应该指定,通过重新启动该过程,模型再次返回正确的对象,我不再看到已删除的对象,但如果我删除更多,问题再次出现。

【问题讨论】:

  • 我对 Django 不太了解,但上次我遇到类似的问题时,我意识到我没有使用我认为的数据库。你最近没有改变路径或任何事情,是吗?
  • @PeterBB 我更新了描述,我确信我使用的是正确的数据库,因为每次重新启动使用该模型的进程都会更新更改。
  • 这发生在 Web 请求之间还是在 shell 级别?
  • 非常奇特。你能提供你的 Django 和 DB 版本吗?

标签: python django orm django-models


【解决方案1】:

这是因为您的数据库隔离级别是可重复读取的。在 django shell 中,所有请求都包含在一个事务中。

已编辑

你可以在你的shell中尝试:

from django.db import transaction
with transaction.autocommit():
    t = TestModel.objects.all()
    ...

【讨论】:

    【解决方案2】:

    听起来像是数据库事务问题。如果您在单独进入数据库本身并修改数据时保持 shell 会话打开,则在 shell 中打开的事务将不会因为隔离而看到更改。您需要退出并重新加载 shell 以获取新事务,然后才能看到它们。

    请注意,在生产中,事务与请求/响应周期相关联,因此这不会是一个重大问题。

    【讨论】:

    • 这是在生产中需要考虑的一个非常重要的问题。因为高隔离级别会导致更多的锁,而低隔离级别可能会影响计算。
    • 我并不是说事务本身并不重要,只是您通常不会看到这种不一致,因为请求是短暂的。
    猜你喜欢
    • 2012-08-10
    • 2018-10-22
    • 2011-12-29
    • 1970-01-01
    • 2018-10-07
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    相关资源
    最近更新 更多