dokku 中的 Celery 看不到 sqlite 记录
Celery in dokku doesn't see sqlite records
我的栈是:Django、Celery(Redis broker)、Dokku。
我的代码将记录放入 sqlite 数据库并为 Celery 放置任务:
package = Package.objects.get(pk=package_id)
package.download_status = 'QUEUE' # package is Django ORM object
package.save()
task_download_package.delay(package.id) # put a task to redis for celery
现在我需要在 Celery 任务中从 sqlite 数据库中获取这个对象。但是在 Celery 任务进程里面我看不到记录:
@app.task(bind=True)
def task_download_package(self,
package_id: int):
try:
package = Package.objects.get(pk=package_id)
except ObjectDoesNotExist:
print("Package with pk={} not found".format(package_id)) # I HAVE GOT THIS MESSAGE
return
但是当我通过我的特殊端点从 Django 进程请求 package.download_status 时,我得到了“QUEUE”状态。
看起来 Django 和 Celery 进程有不同的容器或不同的数据库。
我检查了 connection.settings_dict['NAME'] 并且它 return 与 Django 和 Celery 进程相同的“/app/db.sqlite3”值。
没有 Dokku 的这段代码工作正常,但现在我需要它与 Dokku。
为什么 Celery 在 sqlite 数据库中看不到记录?
它实际上是同一个数据库吗?可能我需要像 Commit 这样的东西? (我用的是Django的保存方式)
我该如何解决?
我已经通过在 Dokku 主机上的公共目录共享 db.sqlite3 文件解决了这个问题。并在应用设置中设置路径:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': '/home/my_user/my_company/my_app/database/db.sqlite3',
}
}
并为应用程序容器共享此目录:
dokku storage:mount my_app /home/my_user/my_company/my_app/database/:/home/my_user/my_company/my_app/database/
我的栈是:Django、Celery(Redis broker)、Dokku。
我的代码将记录放入 sqlite 数据库并为 Celery 放置任务:
package = Package.objects.get(pk=package_id)
package.download_status = 'QUEUE' # package is Django ORM object
package.save()
task_download_package.delay(package.id) # put a task to redis for celery
现在我需要在 Celery 任务中从 sqlite 数据库中获取这个对象。但是在 Celery 任务进程里面我看不到记录:
@app.task(bind=True)
def task_download_package(self,
package_id: int):
try:
package = Package.objects.get(pk=package_id)
except ObjectDoesNotExist:
print("Package with pk={} not found".format(package_id)) # I HAVE GOT THIS MESSAGE
return
但是当我通过我的特殊端点从 Django 进程请求 package.download_status 时,我得到了“QUEUE”状态。 看起来 Django 和 Celery 进程有不同的容器或不同的数据库。 我检查了 connection.settings_dict['NAME'] 并且它 return 与 Django 和 Celery 进程相同的“/app/db.sqlite3”值。
没有 Dokku 的这段代码工作正常,但现在我需要它与 Dokku。 为什么 Celery 在 sqlite 数据库中看不到记录? 它实际上是同一个数据库吗?可能我需要像 Commit 这样的东西? (我用的是Django的保存方式) 我该如何解决?
我已经通过在 Dokku 主机上的公共目录共享 db.sqlite3 文件解决了这个问题。并在应用设置中设置路径:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': '/home/my_user/my_company/my_app/database/db.sqlite3',
}
}
并为应用程序容器共享此目录:
dokku storage:mount my_app /home/my_user/my_company/my_app/database/:/home/my_user/my_company/my_app/database/