Django-数据库迁移-【报错】:CommandError: Conflicting migrations detected、 KeyError: ‘name‘

本文主要是介绍Django-数据库迁移-【报错】:CommandError: Conflicting migrations detected、 KeyError: ‘name‘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、问题复现:

修改了某个模型类后:执行python manage.py makemigrations

报错:

CommandError: Conflicting migrations detected;To fix them run 'python manage.py makemigrations --merge'

根据提示执行:python manage.py makemigrations --merge

报错:django.db.utils.OperationalError: (1050, "Table 'cabinet_box_message' already exists")

想再试试执行:python manage.py makemigrations

报错:old_field = model_state.fields.pop(self.name)  KeyError: 'name'

二、问题解决方法

2.1、删除迁移文件

1、到每个应用下的migrations目录下

注意:将migrations目录下除了__init__.py 外,其他文件都删除

 删除成下面:

特别注意:是每个应用下都要进行这个操作,省得去排错了。

2、将所有更改模型类的操作都还原了【这个必须做,不然会有问题】

我不是给某个模型类增加了一个字段后,再执行迁移命令嘛!

进入到该模型类中,将那新增的字段给注释掉。 

注意:如果操作了很多张表的话,一定不要漏了某个字段了。尤其是新增或删除字段的。

3、找到项目的数据库

在数据库中找到:django_migrations表进行如下操作:

3.1、删除迁移记录

注意:app对应的是auth、admin、contenttypes的不要去删除,下面这些不要动它。【系统依赖】

 上面这些记录,不要删除,千万不要删除。

删除其他应用中除了 0001_initial 的记录:其他应用删除如下结果

 

3.2、执行迁移命令

特别注意:在执行迁移命令前,要确保你之前做的修改都还原了。

比如:我在模型类中新增了一个字段,我到模型类中将新增的字段注释掉。

#生成迁移文件

python manage.py  makemigrations

显示:

     --create

     --create

        ......

        全是创建表

此时,会在每个应用下的migrations目录下,生成001_inital.py文件,这个是迁移文件。还没有在物理数据库中进行建表操作。

#执行迁移文件中的命令

python manage.py migrate

显示:

Running migrations:

         No migrations to apply.

#出现这个才是正确的

看到这里,你可能觉得不需要去删除django_migrations表中的记录。如果你有这个想法,恭喜你,大致上理解了为什么这样做能解决问题了。

之所以会删除django_migrations中的记录,是为了不出现潜在的bug,不怕一万就怕两万呀。

3.3、可能出现的报错

django.db.migrations.exceptions.InconsistentMigrationHistory: Migration auth.0006_require_contenttypes_0002 is applied before its dependency contenttypes.0002_remove_content_type_name on database 'default'.

原因是你删除了django_migrations表中:

app是 contenttypes,name是0002_remove_content_type_name的记录,把该记录加回去就可以了。

3.4、现在你可以正常使用迁移命令了

1、去给某个模型类新增一个字段。

【注意:新增字段时,要设置null=True或default='' ,不然报错】

然后执行:

python manage.py  makemigrations

执行完,去对应的migrations目录下看是否生成了迁移文件。再去django_migrations表中看,是不是该迁移文件还没有记录。

python manage.py migrate

执行完,去django_migrations表中看,是不是该迁移文件有一条记录了。再看看数据库,是不是新增了一个字段了。

三、django迁移命令的大致解析

1、python manage.py makemigrations命令的功能

对于首次执行这个命令时,会在原因的migrations目录下生成0001_inital.py文件

当有了0001_inital.py文件,再执行该命令生成的迁移文件是:000x_模型类_字段.py

在执行该命令时具体有哪些操作

1.1、将模型类的操作写到迁移文件中,是以orm的命令格式。

1.2、此时只是将模型类转换成orm的迁移命令,写到迁移文件中。没有去操作django_migrations表,也没有去执行迁移命令在物理数据库中创建表等操作。

2、python manage.py migrate命令的功能

2.1、在执行该命令后,会对比迁移文件名和django_migrations表中的记录。

        如果该迁移文件在记录中已经存在了,就不会去执行该迁移文件,也就不会去操作物理数据库了。

        如果该迁移文件在表中没有记录,就会去执行迁移文件,去操作物理数据库,该建表就建表,修改字段就修改字段等等。还会将该迁移文件,记录到django_migrations表中,表明该迁移文件已经执行过了。

3、扩展

其实在执行python manage.py migrate时,还会操作:django_content_type和auth_permission两张表。

django_content_type:记录的是表和应用的关系,就是某个应用下有几个模型类。

auth_permission: 说是记录权限,

 

这篇关于Django-数据库迁移-【报错】:CommandError: Conflicting migrations detected、 KeyError: ‘name‘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/698848

相关文章

MySQL数据库约束深入详解

《MySQL数据库约束深入详解》:本文主要介绍MySQL数据库约束,在MySQL数据库中,约束是用来限制进入表中的数据类型的一种技术,通过使用约束,可以确保数据的准确性、完整性和可靠性,需要的朋友... 目录一、数据库约束的概念二、约束类型三、NOT NULL 非空约束四、DEFAULT 默认值约束五、UN

电脑找不到mfc90u.dll文件怎么办? 系统报错mfc90u.dll丢失修复的5种方案

《电脑找不到mfc90u.dll文件怎么办?系统报错mfc90u.dll丢失修复的5种方案》在我们日常使用电脑的过程中,可能会遇到一些软件或系统错误,其中之一就是mfc90u.dll丢失,那么,mf... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

数据库面试必备之MySQL中的乐观锁与悲观锁

《数据库面试必备之MySQL中的乐观锁与悲观锁》:本文主要介绍数据库面试必备之MySQL中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数... 目录一、引言二、乐观锁(一)原理(二)应用场景(三)示例代码三、悲观锁(一)原理(二)应用场景(三)示例

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

解决SpringBoot启动报错:Failed to load property source from location 'classpath:/application.yml'

《解决SpringBoot启动报错:Failedtoloadpropertysourcefromlocationclasspath:/application.yml问题》这篇文章主要介绍... 目录在启动SpringBoot项目时报如下错误原因可能是1.yml中语法错误2.yml文件格式是GBK总结在启动S