Heroku部署Django应用:PostgreSQL迁移失败排查求助
我来帮你一步步排查和解决这些问题,核心矛盾是迁移(migrate)命令没有正确执行,先从这里入手:
一、先解决migrate不执行的核心问题
本地Docker里你把migrate放到了web容器的启动命令里,但Heroku的运行机制和本地Docker不一样,直接在web启动命令里跑migrate很容易因为数据库未就绪而失败,而且日志很难追踪。正确的做法是把迁移放到Heroku的Release阶段:
在你的项目根目录创建一个
Procfile(无后缀名),内容如下:release: python manage.py migrate web: gunicorn your_project_name.wsgi:application --bind 0.0.0.0:$PORT注意把
your_project_name换成你实际的Django项目名(就是包含wsgi.py的那个文件夹名)。如果你已经部署过应用,先手动执行一次迁移救急:
安装Heroku CLI后,登录并进入项目目录,执行:heroku run python manage.py migrate执行完后刷新页面,应该就能解决
wagtailcore_site不存在的报错了。
二、逐个解决你的具体疑问
1. 无法直接连接Heroku Dyno
其实用Heroku CLI就能轻松进入Dyno的shell,步骤很简单:
- 先安装Heroku CLI并登录(执行
heroku login) - 进入你的项目根目录,执行:
进去后你就能像本地一样执行Django命令了,比如heroku run bashpython manage.py showmigrations查看迁移状态,python manage.py dbshell进入数据库shell,调试起来非常方便。
2. 确认PostgreSQL是否关联成功
执行这个命令查看Heroku的环境变量:
heroku config
如果能看到DATABASE_URL这个变量,说明Heroku PostgreSQL已经成功关联。另外,你也可以在Dyno的shell里执行python manage.py dbshell,然后输入\dt,如果能看到数据库的系统表(比如pg_stat_user_tables),说明连接完全正常。
3. 页面报错ProgrammingError
这个就是典型的数据库未执行迁移的问题——Django能连接到空数据库,但找不到对应的业务表。只要执行了migrate命令创建好表,这个报错就会消失。
4. 为什么web命令中的migrate无输出?
有两个主要原因:
- 数据库就绪时机问题:Heroku启动web dyno时,可能PostgreSQL实例还没完全初始化完成,此时执行
migrate会失败,但因为进程直接退出,Heroku可能不会保留这部分错误日志。 - 日志捕获问题:本地Docker的日志会直接输出,但Heroku的web日志主要记录web服务启动后的输出,如果
migrate在服务启动前失败,这部分日志可能不会被正常捕获。
用Release阶段执行migrate就可以避免这些问题——Heroku会确保Release阶段的命令在web dyno启动前执行,而且会单独记录Release阶段的日志,你可以用heroku logs --ps release查看迁移的具体输出。
三、额外注意事项
- 生产环境不要用
runserver,它是开发服务器,性能和稳定性都不够,必须用gunicorn这类生产级WSGI服务器,这也是我在Procfile里写gunicorn命令的原因。 - 可以在Dyno的shell里验证数据库配置是否正确:
然后输入:python manage.py shell
确认输出的配置和Heroku的from django.conf import settings print(settings.DATABASES['default'])DATABASE_URL一致。 - 如果migrate还是有问题,执行
python manage.py migrate --verbosity 2,它会输出详细的迁移日志,帮你定位具体错误。
内容的提问来源于stack exchange,提问作者Mr Bonjour

