Celery Worker无法执行Django数据库更新任务的原因排查
问题:Celery任务执行成功但Django模型数据库更新未生效
场景还原
开发需运行长时间后台任务的仪表盘,用Celery执行异步操作更新Section模型的data字段。任务返回成功提示,但数据库中对应字段未发生变化。尝试用事务包裹操作也无法解决,最终定位到Docker容器配置问题。
相关代码
tasks.py 异步任务函数
@shared_task() def generate_content_async(id): data = get_data() # 长时间运行的操作 section = Section.objects.get(id = id) section.data = data section.save() return f"Section with section id: {id} updated"
Section模型定义
class Section(models.Model): data = models.TextField() # 存储逗号分隔的关键词字符串,如"Ebooks, Webinars, Case Studies" count = models.IntegerField(default= -1)
排查与解决方案
- 先排除代码逻辑问题:确认任务实际执行(返回成功信息)、模型字段操作语法正确、事务包裹后仍无效。
- 最终定位核心原因:Docker环境下Django和Celery容器未共享文件系统。若用SQLite作为数据库,两个容器各自持有独立的数据库文件副本;或代码目录未同步,导致Celery使用的模型/配置与Django不一致。
- 解决方法:为Django和Celery容器添加绑定卷,同步以下目录:
- 项目代码目录,确保两个容器使用相同版本的Django代码和模型定义
- 若使用SQLite,同步数据库文件所在目录,让两个容器共享同一个数据库文件
内容的提问来源于stack exchange,提问作者Priyansh Kedia
相关产品推荐
相关产品推荐

