Python django或postgresql的缓存问题

Python django或postgresql的缓存问题,python,django,postgresql,Python,Django,Postgresql,我遇到一个问题,即我的生产服务器为查询显示了不正确的结果(创建和删除已正确说明,但未更新影响结果的现有字段)。我假设这是一个日期比较问题,并花了几个小时进行调试,因为我无法在dev上重现错误。最终,我重新启动了gunicorn,问题消失了。似乎postgresql或django正在缓存queryset结果。我没有设置缓存,所以不理解为什么会发生这种情况 我有两个问题: 谁在做缓存 我怎样才能禁用它我需要询问一下 要在每次调用时进行评估 设置 Python 2.7 Django 1.7 Postg

我遇到一个问题,即我的生产服务器为查询显示了不正确的结果(创建和删除已正确说明,但未更新影响结果的现有字段)。我假设这是一个日期比较问题,并花了几个小时进行调试,因为我无法在dev上重现错误。最终,我重新启动了gunicorn,问题消失了。似乎postgresql或django正在缓存queryset结果。我没有设置缓存,所以不理解为什么会发生这种情况

我有两个问题:

  • 谁在做缓存
  • 我怎样才能禁用它我需要询问一下 要在每次调用时进行评估
  • 设置

    Python 2.7

    Django 1.7

    PostgreSQL

    Ubuntu

    views.py摘录

    class EventList(ListView, FilterMixin):
        model = Listing
        queryset = Listing.events.order_by('-from_date', )
    
    models.py摘录

    class Listing(models.Model):
        title = models.CharField(max_length=200, null=True)
        to_date = models.DateTimeField(null=True, blank=True)
        from_date = models.DateTimeField(null=True, blank=True)
        events = EventManager()
        event = models.ForeignKey('Event', related_name='listings', null=True, blank=True, on_delete=models.SET_NULL)
    
    class EventManager(models.Manager):
        def get_queryset(self):
            now = arrow.now()
            # Only listings which have events ending after today
            qry = super(EventManager, self).get_queryset().filter(event__isnull=False).select_related('event').filter(to_date__gte=now.datetime)
            return qry
    

    如果没有添加任何缓存层,Django就不可能有缓存。它不是从Django的盒子里出来的。你必须从别处寻找问题的根源。根据您给出的部分代码,不可能推测可能的原因

    尝试找出您的开发服务器和生产服务器之间的差异,只有这样才能为您提供确定问题的初步线索

  • 生产服务器是否位于不同的时区

  • prod和dev的环境和环境变量有什么区别

  • gunicorn重新启动时有什么变化

  • 如果缺陷在生产中再次出现,需要多长时间才能恢复。可以使用logstash和kibana等工具在生产上添加日志事件吗

  • Python语言在日期时间处理方面有一些不直观的方面。你可以阅读更多,这里有一篇文章。-


  • 这些是可以用来找出根本原因的一般策略

    如果没有添加任何缓存层,Django不可能有缓存。它不是从Django的盒子里出来的。你必须从别处寻找问题的根源。根据您给出的部分代码,不可能推测可能的原因

    尝试找出您的开发服务器和生产服务器之间的差异,只有这样才能为您提供确定问题的初步线索

  • 生产服务器是否位于不同的时区

  • prod和dev的环境和环境变量有什么区别

  • gunicorn重新启动时有什么变化

  • 如果缺陷在生产中再次出现,需要多长时间才能恢复。可以使用logstash和kibana等工具在生产上添加日志事件吗

  • Python语言在日期时间处理方面有一些不直观的方面。你可以阅读更多,这里有一篇文章。-


  • 这些是可以用来找出根本原因的一般策略

    这似乎是一个导入时间评估问题(正如您所说,在某种程度上是一个日期比较问题)

    导入views.py模块后,将计算
    EventList
    类的
    queryset
    成员。结果是一个
    QuerySet
    实例,它是在导入时计算的。因此,
    .filter(to_date\u gte=now.datetime)
    部分实际上是在当时执行的,因此日期实际上总是相同的(导入时的日期)

    调用视图时,django在幕后所做的一切就是将
    .all()
    附加到查询集,以强制对查询进行新的计算。但由于datetime筛选器实际上是在加载模块时计算的,因此它将始终按相同的日期进行筛选。例如,如果您插入日期在服务器重新启动之前的新列表,我希望您获得这些新结果

    对于此类需要动态筛选的情况,您应该替代
    ListPageView.get\u queryset
    方法,以强制执行运行时计算:

    class EventList(ListView, FilterMixin):
       def get_queryset(self):
          return Listing.events.order_by('-from_date')
    

    这似乎是一个导入时间评估问题(正如您所说,在某种程度上是一个日期比较问题)

    导入views.py模块后,将计算
    EventList
    类的
    queryset
    成员。结果是一个
    QuerySet
    实例,它是在导入时计算的。因此,
    .filter(to_date\u gte=now.datetime)
    部分实际上是在当时执行的,因此日期实际上总是相同的(导入时的日期)

    调用视图时,django在幕后所做的一切就是将
    .all()
    附加到查询集,以强制对查询进行新的计算。但由于datetime筛选器实际上是在加载模块时计算的,因此它将始终按相同的日期进行筛选。例如,如果您插入日期在服务器重新启动之前的新列表,我希望您获得这些新结果

    对于此类需要动态筛选的情况,您应该替代
    ListPageView.get\u queryset
    方法,以强制执行运行时计算:

    class EventList(ListView, FilterMixin):
       def get_queryset(self):
          return Listing.events.order_by('-from_date')
    

    请发布您的模型和视图代码。这不太可能是缓存或与数据库有关;更可能是在类或模块级别评估的查询集。但我们不能不看代码就帮不上忙。@DanielRoseman请看更新的问题。我面临的问题是,当一个列表被撤销时,截止日期被设置为今天的前一天,但是queryset(EventManager中的那个)继续返回它,直到gunicorn重新启动。感谢您的帮助PostgreSQL不会缓存结果集。曾经因此,它不是PostgreSQL,除非您运行在可序列化的
    事务中并看到一个旧快照,在这种情况下,这是出于设计和您的应用程序的要求。请发布您的模型和查看代码。这不太可能是缓存或与数据库有关的任何内容;更像