Как я могу использовать 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) в моем стеке.