Djando Celery:Celery任务不会在DB中创建记录

时间:2017-02-14 10:44:41

标签: python django-models celery

我想用celery任务创建数据库记录。但由于某种原因,object.save()方法无法使用task.apply_async()(应用任务异步)。

相同记录(Ticker)在本地运行芹菜任务时保存在数据库中:

get_all_tickers.apply()

但是不能用异步模式保存:

get_all_tickers.apply_async()

在这两种情况下,INSERT语句都在服务器日志中可见。

models.py

class Ticker(TimeStampedModel):
    ask = models.DecimalField(max_digits=18, decimal_places=8)
    bid = models.DecimalField(max_digits=18, decimal_places=8)
    pair = models.ForeignKey(Pair)

tasks.py

from celery import shared_task
...
@shared_task()
def get_all_tickers():
    pair = Pair.objects.last()
    ticker = Ticker(ask=Decimal(1.0), bid=Decimal(1.0), pair=pair)
    ticker.save()

1 个答案:

答案 0 :(得分:0)

Django服务器( root )和celery( celery_user )任务由不同的用户运行,因此, celery_user 没有写入权限数据库。那么task.apply() root 运行,save()可以记录task.apply_async() - celery_user ,但不能。

此问题的短期解决方案是让 celery_user 成为数据库的所有者(使用sqlite3开发环境):

chown celery_user:celery_user db.sqlite3

虽然将组添加到 celery_user 会更合适(短期)。

或长期 - 使用无特权的用户https://www.syncano.io/blog/configuring-running-django-celery-docker-containers-pt-1/

运行所有内容

p.s:我在使用http://docs.celeryproject.org/en/latest/reference/celery.contrib.rdb.html(芹菜的调试工具)时遇到了一些问题。每次收到任务时(即每30秒),Telnet就会断开连接。确保您正在使用专用于调试的任务。