【问题标题】:Django model doesn't get saved to database inside Celery TaskDjango 模型没有保存到 Celery Task 中的数据库中
【发布时间】:2014-01-08 22:31:31
【问题描述】:

我遇到了一个非常糟糕的情况。我有以下设置。 我有一个 django 模型,它代表一个带有 django FSM field 的 FSM

我有一个 celery 任务,它发送一封电子邮件,然后推进主要对象 FSM 的状态。从 celery 任务的角度来看,对象“似乎”被保存了。但从主要 django 进程的角度来看,该对象没有被更新。奇怪的是辅助对象被正确保存到数据库中,然后可以从主 django 进程访问。

我在 Celery 任务的对象上显式调用 .save(),并且 date_last_modified = models.DateTimeField(auto_now=True, null=True) 字段在 Celery 任务中的时间戳比主线程晚,尽管我不确定这是否表明任何事情,即它可能已更新,但尚未将更新刷新到数据库。

我正在使用 django 1.5.1, PostgreSQL 9.3.0, 芹菜 v3.1.0, Redis 2.6.10

像这样运行 Celery $ celery -A tracking worker -E -B -l info

任何关于为什么会发生这种情况的想法将不胜感激

【问题讨论】:

    标签: python django postgresql redis celery


    【解决方案1】:

    你是否在保存后重新获取对象? IE。不只是查看您在保存之前获得的实例吗?

    【讨论】:

      【解决方案2】:

      我在 Django 1.5 上遇到过类似的问题

      我猜是因为 Django 不会立即将更改提交到数据库。

      添加

          'OPTIONS': {
              'autocommit': True
          }
      

      DATABASES 设置为我解决了这个问题。

      在 Django 1.6+ 中不会存在问题,因为autocommit 是那里的默认值。

      【讨论】:

        【解决方案3】:

        交易呢?您可以尝试设置CELERY_EAGER_PROPAGATES_EXCEPTIONS=True 并使用-l DEBUG 运行celery 以查看模型.save() 调用后是否发生任何错误。

        还要注意并发更新。当一个进程读取模型时,celery 读取并保存相同的模型,如果初始进程稍后调用models.save(),它将覆盖其中的所有字段。

        【讨论】:

        猜你喜欢
        • 2021-05-03
        • 2020-07-11
        • 1970-01-01
        • 1970-01-01
        • 2016-07-07
        • 2021-06-28
        • 2017-09-24
        • 2013-08-19
        • 1970-01-01
        相关资源
        最近更新 更多