DJCelery
未将任务结果存储在我的Django
SQLite
数据库中。
我有一个现有的Django项目,我已经开始设置Celery w / RabbitMQ了。我启动了我的RabbitMQ服务器。我可以运行Celery python manage.py celeryd --verbosity=2 --loglevel=DEBUG
和Celerybeat python manage.py celerybeat --verbosity=2 --loglevel=DEBUG
。一切都启动w / out错误,我的定期示例任务也运行没有错误。
我使用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
部分,其中包含表格Crontabs
,Intervals
,Periodic tasks
,Tasks
和{{ 1}}。但我的任务中没有任何数据。
有人能指出可能出错或丢失的内容吗?谢谢你的时间。
答案 0 :(得分:2)
djcelery
支持sqlalchemy
,在Django
之外使用单独的后端数据库。
在我的venv
内,我跑了pip install sqlalchemy
。然后我将CELERY_RESULT_BACKEND = 'db+sqlite:///celery_results.sqlite3'
放入settings.py
。这将Celery
连接到新的SQLite
数据库以用于状态/结果。
运行celery -A <projectapp>.celery:app worker
然后在启动消息中显示数据库:
...
- ** ---------- .> transport: amqp://guest:**@localhost:5672//
- ** ---------- .> results: sqlite:///celery_results.sqlite3
- *** --- * --- .> concurrency: 1 (prefork)
...
起初我很担心,因为我的Django项目目录中没有创建数据库文件。这是因为我还没有完成任务。一旦我完成了我的第一个任务,数据库&amp;表格是正确创建的。
我通过运行脚本验证了任务结果存储在数据库中:
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()
我通过以下方式找到了表名:
print(engine.table_name())
希望这可以帮助别人。
答案 1 :(得分:1)
celery docs提到了一些不同的语法,不确定您尝试的是有效的。请尝试以下方法:
# use a connection string
CELERY_RESULT_BACKEND = 'db+sqlite:///foo.db'
更新:
在评论中,the docs also mention也可以使用Django ORM / Cache作为结果后端。为此,您必须将尝试过的设置传递到celery app config:
app.conf.update(
CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend',
)
或者,文档也解释
如果您已将Celery连接到Django设置,则可以添加 这直接进入你的设置模块(没有app.conf.update 部分)
这是对同一页面中详述的Celery应用程序配置的引用。这基本上意味着,如果您在模块中配置了芹菜应用程序和,则将Django设置模块添加为Celery的配置源,然后设置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'