首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DJCelery不存储任务会导致Django SQLite DB

DJCelery不存储任务会导致Django SQLite DB
EN

Stack Overflow用户
提问于 2016-07-06 18:19:25
回答 2查看 1.7K关注 0票数 1

DJCelery没有在我的Django SQLite DB中存储任务结果。

我有一个已有的Django项目,我已经开始设置芹菜w/ RabbitMQ了。启动了我的RabbitMQ服务器。我能运行芹菜python manage.py celeryd --verbosity=2 --loglevel=DEBUG和赛勒提比python manage.py celerybeat --verbosity=2 --loglevel=DEBUG。一切都会启动w/ out错误,而我的定期示例任务也没有错误地运行。

我使用pip install django-celery来安装。我在已安装的应用程序中安装了djcelery,并运行了python manage.py migrate djcelery。我将CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend'添加到settings.py文件的末尾。

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

代码语言:javascript
复制
...
- ** ---------- .> transport: amqp://guest:**@localhost:5672//
- ** ---------- .> results:
- *** --- * --- .> concurrency: 1 (prefork)
...

结果部分为空白,这表明配置是不正确的,但我不知道如何配置。我尝试在我的app.conf.update文件中使用celery.py设置CELERY_RESULT_BACKEND,但是得到了相同的结果。我忽略了CELERY_RESULT_BACKEND,但这没有结果。我还尝试将'database'替换为'djcelery.backends.database:DatabaseBackend',但这表明它试图使用sqlalchemy而不是djcelery

当我运行python manage.py runserver时,我可以看到一个包含表CrontabsIntervalsPeriodic tasksTasksWorkersDJCELERY部分。不过,我的任务没有任何数据。

有人能指出什么可能是错误的或丢失的吗?谢谢您抽时间见我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-08 20:00:39

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然后在启动消息中显示数据库:

代码语言:javascript
复制
...
- ** ---------- .> transport: amqp://guest:**@localhost:5672//
- ** ---------- .> results: sqlite:///celery_results.sqlite3
- *** --- * --- .> concurrency: 1 (prefork)
...

一开始我很担心,因为数据库文件不是在Django项目dir中创建的。这是因为我还没执行任务。一旦我运行了第一个任务,数据库和表就被正确地创建了。

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

代码语言:javascript
复制
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()

我通过以下方法找到了表名:

代码语言:javascript
复制
print(engine.table_name())

希望这能帮到别人。

票数 2
EN

Stack Overflow用户

发布于 2016-07-08 11:50:18

芹菜医生提到了几个不同的语法,不确定您尝试过的语法是否有效。尝试以下几点:

代码语言:javascript
复制
# use a connection string
CELERY_RESULT_BACKEND = 'db+sqlite:///foo.db'

更新

与您的评论一样,医生们也提到也可以使用Django /Cache作为结果后端。要做到这一点,必须将尝试过的设置传递到芹菜应用程序配置中:

代码语言:javascript
复制
app.conf.update(
    CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend',
)

或者,文档也解释

如果您已经将芹菜连接到您的Django设置,那么您可以将其直接添加到您的设置模块中(没有app.conf.update部分)。

这是对芹菜应用程序配置的参考,详见同一页。这基本上意味着,如果您在一个模块中配置了您的芹菜应用程序,那么就会添加Django设置模块作为芹菜的配置源,然后在Django设置模块中设置CELERY_RESULT_BACKEND,就像您曾经做过的那样。

文件:proj/proj/celery.py

代码语言:javascript
复制
# important to pass the Django settings to your celery app
app = Celery('proj')
app.config_from_object('django.conf:settings')

文件:proj/proj/setings.py

代码语言:javascript
复制
CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38231042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档