Heroku部署Django项目SQLite数据库处理:migrate命令执行不生效问题
Heroku Django SQLite迁移故障排查与解决方法
常见排查步骤
- 确认迁移文件已提交:检查本地项目所有app下的
migrations目录中生成的迁移文件是否已提交到代码仓库,若未提交,部署到Heroku的代码没有对应迁移文件,执行migrate命令不会生效。 - 验证命令执行环境特性:Heroku的文件系统是临时性的,
heroku run命令会启动一个独立的临时dyno执行操作,命令执行完成后该dyno的文件系统会直接销毁。你在临时dyno中修改的SQLite数据库文件不会同步到实际运行Web服务的dyno中,这是此类问题最常见的诱因。 - 查看迁移执行日志:执行
heroku logs --tail,重新运行迁移命令,查看是否有迁移冲突、依赖缺失、权限不足类的报错。 - 检查数据库配置:确认
settings.py中DATABASES配置项是否为默认的SQLite配置,未绑定Heroku的持久化数据库服务。
解决方法
推荐方案:替换为Heroku PostgreSQL(生产可用)
SQLite本质是本地文件数据库,无法适配Heroku的临时文件系统机制,生产环境必须替换为持久化数据库:
- 执行命令开通免费版PostgreSQL附加组件:
heroku addons:create heroku-postgresql:hobby-dev - 安装适配依赖,将
django-heroku、psycopg2-binary加入项目的requirements.txt - 在
settings.py末尾添加如下配置,自动适配Heroku的数据库环境:
import django_heroku django_heroku.settings(locals())
- 提交所有代码变更后重新部署到Heroku,再执行
heroku run python manage.py migrate,迁移会直接作用于持久化的PostgreSQL数据库,后续服务运行产生的写入数据也不会丢失。
临时方案:仅用于测试验证(生产不可用)
如果仅需临时测试功能,可以将迁移步骤加入构建发布流程:
- 修改项目根目录的
Procfile,添加release命令:
release: python manage.py migrate web: gunicorn 你的项目名.wsgi --log-file -
- 提交代码重新部署,构建阶段会自动执行迁移,修改后的SQLite文件会和代码一起打包到发布包,所有启动的dyno会共用同一个打包后的SQLite文件。注意:服务运行过程中产生的所有数据库写入仍会在dyno重启、重新部署后全部丢失,不可用于生产环境。
内容的提问来源于stack exchange,提问作者rhedwan
相关产品推荐
相关产品推荐

