【问题标题】:Can't access database from Celery - OperationalError('no such table: products_product')无法从 Celery 访问数据库 - OperationalError('no such table: products_product')
【发布时间】:2020-10-10 20:48:03
【问题描述】:

我有 Django 项目,我无法从 Celery 访问/查询 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:

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 配置(项目目录中的 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()

调用 Celery 任务:

get_first_product.delay()

【问题讨论】:

  • 您的 celery 任务如何连接到 postgres?我的意思是配置在哪里?
  • 我刚刚在主帖中添加了配置。

标签: python django docker celery


【解决方案1】:

问题解决了。

我将环境变量文件添加到工作人员并在我的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-31
    • 2020-05-28
    • 1970-01-01
    • 2022-06-15
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    相关资源
    最近更新 更多