Django从SQLite3迁移到MySQL执行migrate报错表不存在问题求助
报错根因分析
- 你遇到的是自定义用户模型场景下的Django迁移依赖顺序问题,不需要手动创建数据库表,migrate自动建表的机制是正常的,报错是配置或迁移流程不规范导致的。
- 最常见的遗漏点是没有在
settings.py中显式配置AUTH_USER_MODEL参数,Django默认还是尝试用内置auth.User的逻辑,和你自定义的CustomUser产生冲突,迁移时提前访问未创建的表。 - 你删除所有旧迁移后直接全局执行
makemigrations,生成的迁移文件顺序不符合依赖要求:Django内置auth、contenttypes等系统应用的迁移依赖CustomUser表,系统迁移先执行时就会访问还没创建的CustomUser表。 - 也有可能是你的自定义用户所在app没有放到
INSTALLED_APPS列表中django.contrib.auth的前面,导致迁移加载顺序错误。
可行解决方案
步骤1:修正配置
检查settings.py文件,确保以下配置正确:
- 你的自定义用户所属app(示例名为djangoapp)已经加入
INSTALLED_APPS列表,且排在django.contrib.auth的前面 - 已经添加指定自定义用户模型的配置:
AUTH_USER_MODEL = "djangoapp.CustomUser"
将djangoapp替换为你自己的应用名即可。
步骤2:重置迁移流程
因为你的MySQL库是空的,直接重走迁移流程即可:
- 清空MySQL中
djangoappdb库的所有残留表,也可以直接执行SQL删库重建,原有用户授权无需修改:
DROP DATABASE djangoappdb; CREATE DATABASE djangoappdb;
- 删除你自己应用(djangoapp)下
migrations目录内的所有文件,仅保留__init__.py,同时删除同目录下的__pycache__文件夹。 - 先单独给自定义用户所属应用生成迁移文件:
python3 manage.py makemigrations djangoapp
- 再执行全局迁移生成:
python3 manage.py makemigrations
- 执行迁移建表:
python3 manage.py migrate
此时不会再出现表不存在的报错。
6. 迁移完成后导入之前导出的业务数据:
python3 manage.py loaddata currData
如果导入时出现外键冲突,可以重新导出数据时添加自然键参数再导入:
# 重新导出命令(可选,仅loaddata报错时执行) python3 manage.py dumpdata --natural-foreign --natural-primary > currData
内容的提问来源于stack exchange,提问作者user1933205
相关产品推荐
相关产品推荐

