Django部署Heroku创建超级用户遇sqlite3.OperationalError错误求助
auth_user表不存在问题的解决方案 问题情况
我用Django搭了个简单应用,部署到Heroku后想创建超级用户,结果先弹出提示说有21个未应用的迁移,得跑python manage.py migrate来应用admin、auth、contenttypes、journpys、sessions这些应用的迁移。但执行完migrate之后,再跑创建超级用户命令还是报错:
sqlite3.OperationalError: no such table: auth_user
本地和Heroku上反复执行过migrate,查了各种常规方案都没解决,最后换成PostgreSQL就搞定了。
解决步骤
1. 安装PostgreSQL相关依赖
先装psycopg2-binary(PostgreSQL的Python适配器)和dj-database-url(用来解析Heroku的数据库URL):
pip install psycopg2-binary dj-database-url
然后更新项目的requirements.txt:
pip freeze > requirements.txt
2. 修改Django的数据库配置
打开项目根目录的settings.py,把原来的SQLite数据库配置替换成PostgreSQL的适配配置:
import os import dj_database_url # 替换原来的SQLITE配置 DATABASES = { 'default': dj_database_url.parse(os.environ.get('DATABASE_URL')) }
如果本地开发还想用SQLite,可以加个判断,只在生产环境用PostgreSQL:
import os import dj_database_url if os.environ.get('DEBUG') == 'True': DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } else: DATABASES = { 'default': dj_database_url.parse(os.environ.get('DATABASE_URL')) }
3. 提交代码并部署到Heroku
把修改后的代码提交到Git,再推送到Heroku:
git add . git commit -m "切换数据库为PostgreSQL" git push heroku main
4. 在Heroku上执行迁移并创建超级用户
先跑迁移命令:
heroku run python manage.py migrate
然后创建超级用户:
heroku run python manage.py createsuperuser
问题原因
Heroku的文件系统是临时的,每次应用重启后,所有本地文件的变更都会丢失。SQLite是基于本地文件的数据库,迁移生成的db文件没法在Heroku上持久保存,相当于每次重启数据库都回到初始状态,自然找不到auth_user表。而PostgreSQL是Heroku官方支持的云端数据库,数据会持久存储,不会出现这类问题。
内容的提问来源于stack exchange,提问作者Uchenna Adubasim

