django.db.utils.OperationalError: (1050, “Table ‘xxx’ already exists”)
今天迁移数据过程中发生的报错,经各种百度后,更加清楚django migrate的过程,现对解决方法进行总结。
python manage.py makemigrations
一、生成迁移文件
二、根据上一次的迁移文件,进行对比,对比后生成 改动那部分 的迁移文件
python manage.py migrate
一、执行迁移
进入正题
为什么回发生这个报错。翻译过来就是说,数据库中已经存在这个数据表。
方法一:
1.删除这个数据表
2.删除跟这个表相关的(懒的话可以全删),位于django该app中migrations文件夹中的迁移文件(别删init文件)
3.删除数据库中名为django_migrations表中,有关该模型所属的app数据(delete from django_migrations where app=‘myapp’)
4.然后你执行那两条命令,就成功了
方法二:
如果不想删除你的表以及表数据的话。
1.删除跟这个表相关的(懒的话可以全删),位于django该app中migrations文件夹中的迁移文件(别删init文件)
2.删除数据库中名为django_migrations表中,有关该模型所属的app数据(delete from django_migrations where app=‘myapp’)
3.然后根据你表的DDL,编写model。两者数据结构保持一致。
4.执行命令
python manage.py makemigrations
python manage.py migrate --fake
这篇文章最重点就是那个 --fake
你可以理解为,使django忽略表已存在,继续执行迁移文件,类似ignore。
话说回来,如果你model跟数据库表结构不一样,那么它会忽略这一次区别。
例子:数据库该表有字段a,b ;生成的迁移文件里表结构有字段a,b,c。那么运行该指令后,数据结构不会有所更新;
当你第二次迁移文件添加d字段,数据库结构也只会添加d字段;