我正试图使用芹菜和芹菜节拍来运行一个计划任务来处理数据库中的数据,但当我尝试运行该任务时,我收到了错误"django.db.utils.OperationalError:FATAL:角色"tanaka"不存在"。计划任务的代码显示在下方
设置.py
CELERY_BEAT_SCHEDULE = {
'task-number-one': {
'task': 'loans.tasks.update_loan_book',
'schedule': 60,
},
}
tasks.py
@shared_task
def update_loan_book():
tenants = Tenant.objects.all()
for tenant in tenants:
#logic to update tenant object
当我使用"芹菜-A proj worker-l info-B"命令运行任务时,代码可以工作,但当我守护芹菜和芹菜节拍时,代码不工作。芹菜和芹菜节拍的配置文件如下所示。我正在使用supervisord。
[program:projworker]
command=/home/tanaka/microfinance/bin/celery -A cloud_based_microfinance worker -l info
directory=/home/tanaka/Repositories/microfinance_project
user=tanaka
numprocs=1
stdout_logfile=/var/log/celery/proj_worker.log
stderr_logfile=/var/log/celery/proj_worker.log
autostart=true
autorestart=true
startsecs=10
stopwaitsecs = 600
killasgroup=truepriority=998
[program:projbeat]
command=/home/tanaka/microfinance/bin/celery -A cloud_based_microfinance beat -l info
directory=/home/tanaka/Repositories/microfinance_project
user=tanaka
numprocs=1
stdout_logfile=/var/log/celery/proj_beat.log
stderr_logfile=/var/log/celery/proj_beat.log
autostart=true
autorestart=true
startsecs=10
priority=999
当我尝试作为守护程序运行任务时,我会在proj_worker.log文件中得到"django.db.utils.OperationalError:FATAL:role"tanaka"不存在"。
解决了这个问题,如果你的任务要访问数据库,你首先需要一个数据库连接
from django.db import connection
@shared_task
def update_loan_book():
with connection.cursor() as cursor:
tenants = Tenant.objects.all()
for tenant in tenants:
#logic to update tenant object
Celery和django是两个不同的进程,因此您必须从django导入数据库连接,以便Celery访问数据库。如果你没有使用django ORM,这是一个有用的资源