ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

今天在修改models.py文件之后想重新迁移文件
但是出现了以下错误:

C:\Users\Desktop\tutorial>python manage.py makemigrations
You are trying to add a non-nullable field 'highlighted' to snippet without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py
Select an option: 

我搜了一下之后发现可能是因为之前已创建了表中的一条记录,之后模型中增加了一个非空的字段,但是原来已经存在的记录没有这个值(我简单理解为,就是我要把之前已经迁移的表删干净了,才行得通

然后我就开始折腾着删表,我又搜了一下,大概步骤是这样的:
第1步:把app文件夹下的migrations文件夹下除了__init__.py文件外的所有文件都删掉
第2步:登录数据库,找到django_migrations这个表,然后将表内对应的应用app下的migrations记录删除即可(这里有好多张表= =我删了半天,还是我太蠢了)

说是这样说,但是发现在进行第2步的时候,就是我把django_migrations删完之后,傻傻地就去python manage.py makemigrations了,然后再次报错:

django.db.utils.InternalError: (1050, "Table 'django_content_type' already exists")

看到这句第一反应就是去继续 drop table django_content_type;然后又报错了:

ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

当然接下来是继续搜索前人的解决方法啦
然后发现是可能是因为MySQL在InnoDB中设置了foreign key关联,造成无法更新或删除数据。

解决方法:
先关闭外键约束,执行删除操作,然后再开启外键约束

SET foreign_key_checks = 0;  // 先设置外键约束检查关闭
 
drop table django_content_type; // 删除数据,表或者视图
 
SET foreign_key_checks = 1; // 开启外键约束检查,以保持表结构完整性

然后最后我一次次的python manage.py migrate,一次次报错,一次次删表的循环下,终于迁移成功了!手动撒花hhh

C:\Users\Desktop\tutorial>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, snippets
Running migrations:
  Applying snippets.0001_initial... OK

参考博客1
参考博客2
参考博客3
参考博客4

你可能感兴趣的:(django)