Django在Heroku执行migrate成功但创建超级用户提示无表如何解决
Heroku部署Django migrate成功但创建超级用户提示表不存在的解决方案
问题根因
从报错栈可明确判断:你执行createsuperuser时Django实际加载的是SQLite数据库驱动,而非你配置的PostgreSQL。
原因是Heroku的dyno文件系统是临时存储,你执行migrate时生成的SQLite数据库文件仅存在于当时运行migrate的dyno中,新启动的执行createsuperuser的dyno没有这个文件,所以提示表不存在。
可行解决方案
- 修正配置加载入口
首先确认你项目的wsgi.py、asgi.py文件中,DJANGO_SETTINGS_MODULE的取值指向你的生产配置文件,比如你的生产配置是settings/prod.py,对应配置应为:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "你的项目名.settings.prod")
如果指向的是基础settings.py,Django会默认使用基础配置中的SQLite数据库,不会加载你写的PostgreSQL配置。
- 删除无效的env文件读取逻辑
Heroku的配置变量直接存在系统环境中,不需要读取本地.env文件,你配置中的environ.Env.read_env()会尝试读取不存在的本地文件,导致环境变量读取失败, fallback到基础配置的SQLite,直接删除这行即可,保留env = environ.Env()即可。 - 验证数据库配置是否生效
执行命令进入Heroku的Django shell:heroku run -a 你的app名称 python manage.py shell
在shell中执行以下代码打印实际生效的数据库配置:
from django.conf import settings print(settings.DATABASES['default'])
如果输出中的ENGINE值为django.db.backends.postgresql则配置正确,若为django.db.backends.sqlite3则说明配置仍未加载,需回头检查前两步。
- 确认DATABASE_URL环境变量存在
执行命令查看Heroku的配置变量:heroku config -a 你的app名称
确认输出中存在DATABASE_URL变量,值为postgresql://开头的字符串,若不存在可重新安装Heroku PostgreSQL插件自动生成该变量。 - 重新执行迁移与创建超级用户
配置修正后推送代码到Heroku,依次执行:
heroku run -a 你的app名称 python manage.py migrate heroku run -a 你的app名称 python manage.py createsuperuser
即可正常创建超级用户。
内容的提问来源于stack exchange,提问作者Unviray
相关产品推荐
相关产品推荐

