DJCelery不会将任务结果存储在Django SQLite DB中

时间:2016-07-06 18:19:26

标签: django sqlite rabbitmq celery djcelery

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部分,其中包含表格CrontabsIntervalsPeriodic tasksTasks和{{ 1}}。但我的任务中没有任何数据。

有人能指出可能出错或丢失的内容吗?谢谢你的时间。

2 个答案:

答案 0 :(得分:2)

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项目目录中没有创建数据库文件。这是因为我还没有完成任务。一旦我完成了我的第一个任务,数据库&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'