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
。一切都随着错误启动,而我的定期示例任务也运行无误。
我使用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
的Workers
部分。但是我的任务上没有任何数据。谁能指出什么是错误的或丢失的?感谢您的时间。
最佳答案
tutuDajuju将我引向正确的方向-还有更多内容,所以我将其全部写下。我放弃使用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项目目录中创建的。这是因为我还没有执行任务。一旦执行了第一个任务,就可以正确创建数据库和表。
我通过运行脚本验证了任务结果已存储在数据库中:
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())
希望这可以帮助某人。
关于django - DJCelery未将任务结果存储在Django SQLite DB中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38231042/