本文主要是介绍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‘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!