Обновление базы данных Django-Celery
У меня есть задача celery для обновления части моей базы данных. Проблема в том, что если я задерживаю задачу (передаю ее в celery), она обрабатывается, но не обновляет базу данных. Когда я вызываю задачу вручную (например, refresh_printfuldb()
, а не refresh_printfuldb.delay()
), она работает нормально, и я вижу изменения при запросе к базе данных.
Журнал работы celery выглядит следующим образом:
[2021-09-05 16:48:48,541: INFO/MainProcess] Task t_well.tasks.refresh_printfuldb[55eb39eb-f1e4-4b7d-b509-a87affe0535b] received
[2021-09-05 16:48:49,069: INFO/SpawnPoolWorker-32] child process 47336 calling self.run()
[2021-09-05 16:48:49,081: INFO/SpawnPoolWorker-33] child process 42852 calling self.run()
Дерево файлов:
-mysite/
celery.py
settings.py
...
-app/
models.py
tasks.py
printfulapi.py
...
celery.py:
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', "mysite.settings")
app = Celery('mysite')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
settings.py:
...
CELERY_BROKER_URL = 'redis://192.168.1.188:6379'
CELERY_RESULT_BACKEND = 'django-db'
...
models.py:
Как я уже сказал, если я запрошу базу данных после ручного вызова refresh_printfuldb()
, я увижу изменения, так что я полагаю, что проблема не в моделях.
tasks.py:
from celery import shared_task
from . import printfulapi
...
@shared_task
def refresh_printfuldb():
printfulapi.refresh_orders(orders_in_api_page)
#other calls to the printfulapi module
...
...
printfulapi.py:
from .models import Product, Variant, SyncProduct, SyncVariant, Order
def refresh_orders(orders_in_api: List[Dict]) -> None:
for order_in_api in orders_in_api:
order_id = order_in_api["id"]
order = get_object_with_id(Order, order_id)
order.status = order_in_api["status"]
order.created = order_in_api["created"]
order.updated = order_in_api["updated"]
order.recipient = order_in_api["recipient"]
order.items = order_in_api["items"]
order.costs = order_in_api["costs"]
order.save()
#some functions that make changes to the models
#all the functions essentially work like refresh_orders, they're just a bit more
#complicated
#refresh_orders should be a good example
Я использую celery beat для запуска этой задачи каждые 30 минут, и он выполняет ее каждые 30 минут, как и положено. Рабочий получает задание и начинает его обрабатывать. Я просто не вижу изменений в базе данных после ее выполнения. Опять же, я вижу изменения, если refresh_printfuldb
вызывается вручную. В чем может быть проблема?