簡體   English   中英

Django model 沒有保存到 Celery 任務中的數據庫

[英]Django model doesn't get saved to database inside Celery Task

我遇到了一個非常糟糕的情況。 我有以下設置。 我有一個 django model 代表一個帶有django FSM 字段的 FSM

我有一個 celery 任務,它發出一個 email,然后推進主要對象 FSM 的 state。 從 celery 任務的角度來看,object“似乎”被保存了。 但是從主進程 django 的角度來看,object 沒有被更新。 奇怪的是,輔助對象被正確保存到數據庫中,稍后可以從 django 主進程訪問。

我從 Celery 任務中顯式調用 object 上的.save() ,並且date_last_modified = models.DateTimeField(auto_now=True, null=True)字段在 Celery 任務中的時間戳比主線程晚,雖然我不是確定這是否有任何跡象,即它可能已更新但更新尚未刷新到數據庫。

我正在使用 django 1.5.1、postgresql 9.3.0、celery v3.1.0、Redis 2.6.10

像這樣運行 Celery $ celery -A tracking worker -E -B -l info

任何關於為什么會發生這種情況的想法將不勝感激

你在保存后重新獲得對象嗎? 我不只是看看你在保存之前得到的實例嗎?

我和Django 1.5有類似的問題

我想這是因為Django沒有立即提交對數據庫的更改。

添加

    'OPTIONS': {
        'autocommit': True
    }

DATABASES設置為我解決了問題。

Django 1.6+中不存在問題beacuse autocommit是默認值。

交易怎么樣? 您可以嘗試設置CELERY_EAGER_PROPAGATES_EXCEPTIONS=True並使用-l DEBUG運行celery以查看模型.save()調用后是否發生任何錯誤。

還要處理並發更新。 當一個進程讀取模型時,芹菜會讀取並保存相同的模型,如果初始進程稍后調用models.save() ,它將覆蓋其中的所有字段。

在 Django 3.2.7 上遇到了類似您的問題。 在基於 class 的更新視圖中使用get_nb_lines.delay(flow.pk)

修復后,我想這是一種(可能)並發更新或交叉更新(不知道如何稱呼)。

我了解到,在我注意到get_nb_lines.apply_async((flow.pk,), countdown=5)解決了我的問題之后。 如果有人用另一種方式解釋這一點,我會接受。

請注意,因為發送到 function 的參數必須是可迭代的,如錯誤警報所述。 所以在我的例子中,我不得不將flow.pk視為一個列表(在 flow.pk 之后添加一個逗號)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM