Как я могу использовать Celery в Django, используя только БД?

Глядя на https://docs.celeryq.dev/en/v5.2.7/getting-started/backends-and-brokers/index.html, кажется, что это невозможно/нежелательно. Там есть раздел о SQLAlchemy, но Django не использует SQLAlchemy.

В более старых документах есть https://docs.celeryq.dev/en/3.1/getting-started/brokers/django.html .

Возможно ли в последних версиях Celery / Django использовать Celery только с базой данных для хранения сообщений / результатов?

Если вы действительно хотите использовать реляционную SQL базу данных в качестве брокера, SQLAlchemy действительно является лучшим вариантом, поскольку он уже поддерживается Celery. Однако я бы поостерегся использовать этот подход, потому что вы не только (аб)используете реляционную базу данных в качестве брокера сообщений, но и документация Celery рекомендует быть осторожным:

Исторически, SQLAlchemy не является самым стабильным бэкендом результатов поэтому при выборе следует действовать осторожно.

Django действительно не использует SQLAlchemy, потому что у него есть собственный ORM, но это не мешает вам использовать SQLAlchemy в Celery worker.

Да, вы можете сделать это, даже если это не самый эффективный/рекомендованный способ. Я использую его для простых проектов, в которых я не хочу добавлять Redis.

Для этого сначала добавьте SQLAlchemy v1 в качестве зависимости в свой проект: SQLAlchemy = "1.*"

Затем в файле settings.py:

  • если вы используете PostgreSQL: CELERY_BROKER_URL = sqla+postgresql://user:pwd@127.0.0.1:5432/dbname
  • если вы используете SQLite: CELERY_BROKER_URL = "sqla+sqlite:///" + os.path.join(BASE_DIR, 'your_database.db') . Обратите внимание, что папка с базой данных должна быть доступна для записи. Например, если ваша база данных находится в папке project/dbfolder/database.db, то подойдет папка chmod 777 project/dbfolder.

В качестве примечания, я использую django-celery-results для хранения результатов моих задач. Таким образом, у меня есть полноценный Celery без использования других технических инструментов (например, rabbitMQ или Redis) в моем стеке.

Вернуться на верх