【问题标题】:DJCelery not storing task results in Django SQLite DBDJCelery 不在 Django SQLite DB 中存储任务结果
【发布时间】:2016-07-06 18:19:25
【问题描述】:

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

我有一个现有的 Django 项目,我已经开始设置带有 RabbitMQ 的 Celery。我启动了我的 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 部分包含表CrontabsIntervalsPeriodic tasksTasksWorkers。不过我的任务中没有任何数据。

谁能指出可能有什么问题或遗漏?感谢您的宝贵时间。

【问题讨论】:

    标签: django sqlite rabbitmq celery djcelery


    【解决方案1】:

    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())
    

    希望这对某人有所帮助。

    【讨论】:

      【解决方案2】:

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

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

      更新

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

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

      或者,文档也解释了

      如果您已将 Celery 连接到您的 Django 设置,那么您可以添加 这直接进入您的设置模块(没有 app.conf.update 部分)

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

      文件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'
      

      【讨论】:

      • 嗨,Django 文档Using Celery with Django 指定您可以使用CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend',。您发布的内容没有使用djcelery,而是使用sqlalchemy
      猜你喜欢
      • 2022-11-25
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      • 2013-05-13
      相关资源
      最近更新 更多