Heroku执行Django loaddata加载dump.json报Fixture不存在解决方法
问题描述
- 开发学校课程项目,前端使用Next.js,后端基于Python Django,已完成Heroku后端部署与PostgreSQL数据库配置,所有部署步骤参考发布1年的Udemy教程操作,此前部署问题均已排查解决,当前问题无法定位根因。
- 按教程流程:导出数据为
dump.json后,执行heroku run python manage.py loaddata dump.json即可完成Heroku端数据库填充,之后对接Django Rest Framework即可正常运行。但实际执行命令时(必须指定manage.py路径才可正常触发命令)持续报错提示Fixture不存在。 - 已尝试的排查操作:指定dump.json相对/绝对路径执行命令、将dump.json移动到项目不同目录重试;创建dump.json后依次执行
git add .、git commit -m 'changes'、git push heroku master,确认本地无待提交内容,推送提示无新内容可提交,但报错仍未解决。 - 已附操作报错截图、项目目录结构截图,可按需补充其他排查信息。
解决方案
按优先级依次尝试以下操作,绝大多数同类问题会在前两步解决:
修正Heroku命令执行的路径问题
你提到必须指定manage.py路径才能触发命令,说明heroku run默认启动的shell工作目录不是Django项目根目录。Django的loaddata命令默认仅从两个位置搜索fixture文件:各已注册app下的fixtures/目录、执行命令时的当前工作目录,不会顺着你输入的manage.py文件路径自动搜索同目录下的文件。
先执行以下命令确认Heroku容器内的实际目录结构:heroku run pwd heroku run ls -la找到manage.py在容器内的绝对路径(通常为
/app/你的项目名/manage.py),之后执行loaddata时,manage.py和dump.json都写全绝对路径,不要用相对路径:heroku run python /app/你的项目名/manage.py loaddata /app/你的项目名/dump.json验证dump.json是否真的被推送到Heroku端
不要仅以本地git推送提示为准,多数开发者会在.gitignore中配置*.json忽略规则,导致dump.json从未被纳入git版本跟踪,push时根本没有上传到Heroku容器。
执行以下命令直接查看容器内项目目录下的文件列表:heroku run ls -la /app/你的项目名/如果输出中没有dump.json,先打开本地项目根目录的
.gitignore文件,删除屏蔽*.json或dump.json的规则,重新执行add、commit、push操作后再次验证文件存在。验证fixture文件合法性
如果文件确实存在仍报错,先在本地环境验证dump.json格式是否合法,避免导出时混入控制台日志、文件编码错误(要求UTF-8无BOM)导致Django无法识别:python manage.py loaddata dump.json --exclude=contenttypes --exclude=auth.Permission注意:如果dump.json是从本地数据库全量导出的,必须加上述exclude参数跳过contenttypes、auth.Permission两个表,否则导入时会出现主键冲突,这两个表的初始数据会在Django执行migrate时自动生成。
零路径依赖备选导入方案
如果以上操作都无法解决,完全跳过Heroku端的文件查找逻辑,直接通过管道将本地dump.json的内容流传输到Heroku端导入,不需要容器内存储fixture文件:cat dump.json | heroku run python manage.py loaddata --format=json -
内容的提问来源于stack exchange,提问作者Chris Johnson

