DJCelery 不在 Django SQLite 数据库中存储任务结果

DJCelery not storing task results in Django SQLite DB

DJCelery 没有将任务结果存储在我的 Django SQLite 数据库中。

我有一个现有的 Django 项目,我已经开始在其上设置带有 RabbitMQ 的 Celery。我启动了我的 RabbitMQ 服务器。我可以 运行 Celery python manage.py celeryd --verbosity=2 --loglevel=DEBUG 和 Celerybeat python manage.py celerybeat --verbosity=2 --loglevel=DEBUG。一切都开始时没有错误,我的周期性示例任务也 运行s 没有错误。

我是用pip install django-celery安装的。我安装的应用程序中有 djcelery 和 运行 python manage.py migrate djcelery。我在 settings.py 文件的末尾添加了 CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend'

当我运行python manage.py celeryd --verbosity=2 --loglevel=DEBUG时,启动文字显示:

...
- ** ---------- .> transport: amqp://guest:**@localhost:5672//
- ** ---------- .> results:
- *** --- * --- .> concurrency: 1 (prefork)
...

结果部分为空表明配置不正确,但我不知道怎么办。我尝试在我的 celery.py 文件中使用 app.conf.update 来设置 CELERY_RESULT_BACKEND 但得到了相同的结果。我遗漏了 CELERY_RESULT_BACKEND,但默认情况下没有结果。我也尝试使用 'database' 而不是 'djcelery.backends.database:DatabaseBackend' 但这表明它试图使用 sqlalchemy 而不是 djcelery.

当我 运行 python manage.py runserver 时,我可以看到 DJCELERY 部分包含表格 CrontabsIntervalsPeriodic tasksTasks,以及 Workers。但是我的任务没有任何数据。

谁能指出错误或遗漏的地方?谢谢你的时间。

celery docs 提到了几种不同的语法,不确定您尝试的是否有效。尝试以下操作:

# use a connection string
CELERY_RESULT_BACKEND = 'db+sqlite:///foo.db'

更新:

如您的评论所述,the docs also mention 也可以使用 Django ORM/Cache 作为结果后端。为此,您必须将您尝试的设置传递到您的芹菜应用程序配置中:

app.conf.update(
    CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend',
)

或者,文档也解释了

If you have connected Celery to your Django settings then you can add this directly into your settings module (without the app.conf.update part)

这是对同一页面中详述的 Celery 应用程序配置的参考。这基本上意味着如果你在一个模块中配置你的芹菜应用程序,你添加Django设置模块作为芹菜的配置源,然后设置CELERY_RESULT_BACKEND 在您的 Django 设置模块中,就像您所做的那样,也将起作用。

文件: proj/proj/celery.py

# important to pass the Django settings to your celery app
app = Celery('proj')
app.config_from_object('django.conf:settings')

文件: proj/proj/settings.py

CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend'

tutuDajuju 指引了我正确的方向 - 还有更多内容,所以我会全部写下来。我放弃使用 djcelery,转而使用 sqlalchemy,在 Django.

之外使用单独的后端数据库

在我的venv里面我运行pip install sqlalchemy。然后我将 CELERY_RESULT_BACKEND = 'db+sqlite:///celery_results.sqlite3' 放入 settings.py。这将 Celery 连接到新的 SQLite 数据库以供 state/results.

使用

运行 celery -A <projectapp>.celery:app worker 然后在启动信息中显示数据库:

...
- ** ---------- .> transport: amqp://guest:**@localhost:5672//
- ** ---------- .> results: sqlite:///celery_results.sqlite3
- *** --- * --- .> concurrency: 1 (prefork)
...

起初我很担心,因为数据库文件没有在我的 Django 项目目录中创建。这是因为我还没有 运行 任务。一旦我 运行 我的第一个任务,数据库和 table 就被正确创建了。

我已通过 运行 脚本验证任务结果存储在数据库中:

from sqlalchemy import create_engine

engine = create_engine("sqlite:///celery_results.sqlite3")
connection = engine.connect()

result = connection.execute("select * from celery_taskmeta")

for row in result:
    print(row)

connection.close()

我通过以下方式找到了 table 个名字:

print(engine.table_name())

希望这对某人有所帮助。