Невозможно получить доступ к базе данных из Celery - OperationalError ('нет такой таблицы: products_product') - PullRequest
0 голосов
/ 20 июня 2020

У меня есть проект 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()

1 Ответ

0 голосов
/ 21 июня 2020

Проблема решена.

Я добавил файл переменных окружения в рабочий файл и разбил контейнеры в свой docker файл compose:

env_file: ./env/dev/.env

Кстати, это решило и мою вторую ошибку:

SMTPServerDisconnected('please run connect() first')

Я не мог отправить электронное письмо из Celery, и опять же, за пределами Celery у меня нет никаких проблем. В этом файле у меня есть электронная почта и конфигурация базы данных:

SQL_ENGINE=django.db.backends.postgresql
SQL_DATABASE=your_database
SQL_USER=username
SQL_PASSWORD=your_password
SQL_HOST=db
SQL_PORT=5432
EMAIL_HOST=smtp.gmail.com
EMAIL_HOST_USER=your_email
EMAIL_HOST_PASSWORD=your_password
EMAIL_PORT=587
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...