django迁移报错解决
- 1、了解Django迁移过程
- 第一步:生成迁移文件
- 第二步:执行迁移文件
- 了解 迁移文件和迁移记录条 的关系
- 1.1、可能出现的问题及解决办法
- 1.1.1、第一种,新增加字段时
- 1.1.2、第二种,不知道为啥迁移就是出现错误了(这里只是提供了问题的解决思路)
- 1.1.2.1、可能出现的问题
- 1.1.2.2、解决思路
- ①迁移文件和迁移记录不一致时
- ②迁移文件和迁移记录一致后,重新执行还是报错
- ③迁移记录和数据库的内容不一致(这种情况多半是自己手动改了数据库里面的表结构,没有通过models.py)
- 1.2、其他解决方案
- 1.3、上面的解决方案都用过了,还是有问题
- 2、版本问题
- 3、No changes detected
- 4、TypeError: __init__() missing 1 required positional argument: 'on_delete'
1、了解Django迁移过程
第一步:生成迁移文件
- 1生成迁移文件代码
- 2迁移文件所在位置
- 3迁移内容
迁移文件内容里面记录了本次迁移内容,和继承过来的前面几次的迁移
(继承一定要正确,比如你删了其中一个迁移文件,就可能导致继承不正确而无法执行迁移文件)
第二步:执行迁移文件
123是截图位置
- 1执行迁移代码
- 2迁移后记录迁移数据所在位置
- 3迁移记录内容
了解 迁移文件和迁移记录条 的关系
仔细观察你会发现,迁移文件名和迁移记录条里的name是一一对应的
1.1、可能出现的问题及解决办法
1.1.1、第一种,新增加字段时
如果你在模型中新增加了一个字段,执行迁移时可能会出现类似这样的代码
这是让你选择,填1或则2就行
- 选1:让你写一个该新字段的默认值(选1回车,接着再写一个值再回车就ok了,注意赋值类型要对应你设置的类型)
- 选2:会直接退出,然后需要你自己再models.py对应新增加的字段后面加上一个 default=多少,然后再次生成迁移、执行迁移,就OK了
1.1.2、第二种,不知道为啥迁移就是出现错误了(这里只是提供了问题的解决思路)
首先查看报错原因,看不懂英文可以直接复制出来百度。
1.1.2.1、可能出现的问题
- 迁移文件继承有问题
- 报错pymysql.err.InternalError
- 报错django.db.utils.InternalError
1.1.2.2、解决思路
①迁移文件和迁移记录不一致时
- 1、核对迁移文件和迁移记录是否一致(像我下面的截图一样,序号应该是连贯的)
- 2.1、(如果迁移文件比记录多)先删除记录里没有的迁移文件,再重新生成并迁移
- 2.2、(如果记录比迁移文件多)跳过①,直接执行②
②迁移文件和迁移记录一致后,重新执行还是报错
如果①之后还是报错,再用②
- 1、models.py先还原成修改前的样子
- 2、再删除记录里没有的迁移文件(如果没有跳过)
- 3、生成一个新迁移文件,把新的迁移文件里的operations复制到上一个迁移文件里的operations后面
- 4、复制后新的这个迁移文件就没用了,直接删除
- 6、删除后,添加你想修改或添加的东西到models.py中
- 5、重新生成重新执行新的迁移文件(大部分问题到②这儿应该已经解决了)
③迁移记录和数据库的内容不一致(这种情况多半是自己手动改了数据库里面的表结构,没有通过models.py)
- 1、核对models.py里的代码和数据库
主要看看字段有没有多的,字段名是不是不一样等 - 2.1、如果数据库里面差东西,可以直接在数据库里面加上,保持和models.py一致
- 2.2、如果models.py里面差东西,从②里面的3开始执行
1.2、其他解决方案
python manage.py --fake [版本名字]
https://blog.csdn.net/a599174211/article/details/82795206
1.3、上面的解决方案都用过了,还是有问题
这时候你可以选择暴力解决
1、把迁移文件和迁移记录都删了
2、把建的数据表都删了(如果数据库里有需要的内容可以拷贝成插入语句存到txt里,或者直接导出sql)(models.py里面的内容一般不用删)
3、重新生成迁移文件,重新执行迁移文件,再核对迁移文件和记录是否一致,如果没有问题,就可以向数据库插入数据了
生成迁移文件
python manage.py makemigrations
执行迁移文件,并记录
python manage.py migrate
2、版本问题
出现类似这样的报错
raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.
解决办法:
找到这个文件点进去
将文件中的如下代码注释:if version < (1, 3, 3):
raise ImproperlyConfigured(“mysqlclient 1.3.3 or newer is required; you have %s” % Database.version)
重新在项目manage.py路径下执行命令即可。
然后重新执行迁移就ok了
3、No changes detected
出现这个问题,先执行python manage.py makemigrations --empty booktest
就会发现:是因为没有在setting里面注册app解决办法:
4、TypeError: init() missing 1 required positional argument: ‘on_delete’
出现这个问题的原因是django2以后的版本,在模板中使用外键ForeignKey必须写一个on_delete参数的默认值。
如下例:
参数说明:
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值
CASCADE:此值设置,是级联删除。
PROTECT:此值设置,是会报完整性错误。
SET_NULL:此值设置,会把外键设置为null,前提是允许为null。
SET_DEFAULT:此值设置,会把设置为外键的默认值。
SET():此值设置,会调用外面的值,可以是一个函数。
一般情况下使用CASCADE就可以了。