У меня есть проект Django, и я не могу получить доступ / запросить PostgreSQL из Celery. Он влияет на любую таблицу, даже если она существует. Запросы хорошо работают вне Celery, поэтому я, вероятно, сделал что-то не так в конфигурации Celery. Задачи сельдерея, которые не касаются базы данных, работают хорошо.
Сообщение об ошибке:
Traceback (most recent call last):
File "/usr/src/app/accounts/tests.py", line 28, in test_access_to_database
result_output = task.get()
File "/usr/local/lib/python3.8/site-packages/celery/result.py", line 217, in get
self.maybe_throw(callback=callback)
File "/usr/local/lib/python3.8/site-packages/celery/result.py", line 333, in maybe_throw
self.throw(value, self._to_remote_traceback(tb))
File "/usr/local/lib/python3.8/site-packages/celery/result.py", line 326, in throw
self.on_ready.throw(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/vine/promises.py", line 244, in throw
reraise(type(exc), exc, tb)
File "/usr/local/lib/python3.8/site-packages/vine/five.py", line 195, in reraise
raise value
django.db.utils.OperationalError: no such table: products_product
Все основано на контейнерах docker:
redis:
image: redis:latest
ports:
- 6379:6379
environment:
- TZ=Europe/Warsaw
db:
container_name: gallop_db
image: postgres
volumes:
- postgres_data:/var/lib/postgresql/data/
env_file: ./env/dev/.envdb
worker1:
build: ./app
command: celery -A gallop worker -l debug --pidfile=
links:
- redis
volumes:
- ./app/:/usr/src/app/
depends_on:
- db
- redis
- rabbitmq
celery-beat:
build: ./app
command: celery -A gallop beat -l debug --pidfile=
volumes:
- ./app/:/usr/src/app/
links:
- redis
environment:
- TZ="Europe/Warsaw"
depends_on:
- db
- redis
- rabbitmq
rabbitmq:
image: rabbitmq:latest
environment:
- TZ=Europe/Warsaw
volumes:
postgres_data:
Моя среда:
celery 4.4.5
Python 3.8 (I checked also on 3.7)
Docker 3.3
Django 2.2.10
django-celery-beat 2.0.0
django-celery-results 1.2.1
Зарегистрированные приложения:
DJANGO_APPS = (
#...
'celery',
'django_celery_results',
'django_celery_beat',
)
Сельдерей в Django настройки:
CELERY_BROKER_URL = 'amqp://rabbitmq'
CELERY_RESULT_BACKEND = 'redis://redis'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_IGNORE_RESULT = False
CELERYD_TASK_SOFT_TIME_LIMIT = 60
CELERY_TIMEZONE = 'Europe/Warsaw'
Задача для сельдерея:
@app.task(bind=True, ignore_result=False)
def get_first_product(self):
p = Product.objects.first()
return p
Конфигурация сельдерея (celery.py в каталоге проекта):
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'gallop.settings')
app = Celery('gallop', )
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
Задача вызова сельдерея:
get_first_product.delay()