Django部署Heroku报relation does not exist编程错误如何解决
解决方案
- 确认数据库配置生效
优先使用Heroku官方推荐的dj-database-url包自动读取环境变量中的数据库连接信息,避免手动填写凭证出错,配置示例如下:
配置完成后可运行import dj_database_url DATABASES['default'] = dj_database_url.config(conn_max_age=600, ssl_require=True)heroku run python manage.py shell执行from django.conf import settings; print(settings.DATABASES['default'])确认连接配置和Heroku提供的凭证一致。 - 检查是否已在Heroku生产环境执行数据库迁移
本地生成的迁移文件推送到Heroku后不会自动执行,需要手动运行命令:heroku run python manage.py migrate
运行后观察输出是否有迁移执行失败的报错,如果有报错优先根据报错信息修复迁移逻辑。 - 检查迁移文件一致性
运行命令查看迁移应用状态:heroku run python manage.py showmigrations
如果存在标记为未应用的迁移,确认本地的迁移文件已全部提交推送到Heroku,不要在本地随意删除已提交的迁移文件重新生成,避免生产和本地迁移逻辑不一致。 - 检查表名大小写匹配问题
SQLite对表名大小写不敏感,而PostgreSQL默认会将未加引号的表名转换为小写处理。如果你的模型中通过db_table属性手动指定了大写/大小写混合的表名,会出现Django查询的表名和PostgreSQL中实际生成的表名不一致的问题。
可进入PostgreSQL Shell查看实际存在的表名:heroku run python manage.py dbshell
进入后执行\dt查看所有表名,对比报错信息中的表名是否和实际表名一致,不一致的话将模型的db_table属性改为全小写即可解决。 - 排查部署阶段前置操作的数据库访问
如果你的代码在模块导入层级就执行了数据库查询操作(比如全局变量赋值时查询数据库),会导致在部署阶段执行collectstatic等前置操作时,迁移还未运行就触发数据库访问报错。可以先临时设置Heroku环境变量跳过自动收集静态文件:heroku config:set DISABLE_COLLECTSTATIC=1
手动执行完迁移后再恢复自动收集,或者调整代码将导入层级的数据库查询延迟到实际请求处理时执行。 - 重置数据库重试(仅适用于生产无有效数据的场景)
如果之前的操作残留了异常的表结构,可以先重置Heroku PostgreSQL数据库,再重新执行迁移:heroku pg:reset --confirm 你的Heroku应用名
重置完成后重新运行heroku run python manage.py migrate即可。
内容的提问来源于stack exchange,提问作者Virus Programmer
相关产品推荐
相关产品推荐

