Django migrate报错的解决方案


Posted in Python onMay 20, 2021

前言

在讲解如何解决migrate报错原因前,我们先要了解migrate做了什么事情,migrate:将新生成的迁移脚本。映射到数据库中。创建新的表或者修改表的结构。

问题1:migrate怎么判断哪些迁移脚本需要执行?

它会将代码中的迁移脚本和数据库中django_migrations中的迁移脚本进行对比,如果发现数据库中,没有这个迁移脚本,那么就会执行这个迁移脚本。

问题2:migrate做了什么事情

  1. 将相关的迁移脚本翻译成SQL语句,在数据库中执行这个SQL语句。
  2. 如果这个SQL语句执行没有问题,那么就会将这个迁移脚本的名字记录到django_migrations中。

实战案例

当我们了解清楚migrate的作用后,我们来看一个案例
首先我们创建一个项目orm_migrations_demo,接着创建2个app应用frontarticle,代码结构如下图

Django migrate报错的解决方案

接着在front.models.pyarticle.models.py中创建模型

# front.models.py
class Article(models.Model):
    name = models.CharField(max_length=200)

# article.models.py
class FrontUser(models.Model):
    name = models.CharField(max_length=200)

接着在settings.pyINSTALL_APPS中将app注册

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'front',
    'article',
]

接着我们打开命令行,输入makemigrations article,再输入makemigrations front,此时2个app目录中都会出现迁移文件0001_initial.py,此时数据库中是没有表的,因为还没有执行迁移命令
接着我们执行migrate article,再输入migrate front,migrate发现数据库中没有迁移脚本,那么就会执行刚才生成的2个迁移脚本,将迁移脚本翻译成SQL语句,然后创建了2张表,执行完成后,会将迁移脚本记录到django_migrations表中,数据库中表结构如下:

Django migrate报错的解决方案

django_migrations表中内容如下:

Django migrate报错的解决方案

接下来我们在article.models.py中添加一个content字段

class Article(models.Model):
    name = models.CharField(max_length=200)
    content = models.CharField(max_length=200, null=True)

然后执行命令makemigrations article,会在项目中生成迁移文件0002_article_content.py,接着执行migrate article,执行迁移脚本,此时数据库中表django_migrations有3个迁移脚本

Django migrate报错的解决方案

现在我们来模仿错误信息内容,我们将数据库中django_migrations表中的0002_article_content这行记录删除,然后我们来看下0002_article_content的代码

class Migration(migrations.Migration):

    dependencies = [
        ('article', '0001_initial'),
    ]

    operations = [
        migrations.AddField(
            model_name='article',
            name='content',
            field=models.CharField(max_length=200, null=True),
        ),
    ]

这个迁移脚本的作用是为article模型添加content字段,但是我们现在看一下article中的字段:

Django migrate报错的解决方案

从上图中我们可以清楚的看到article表中已经有了content字段,那么我们再执行migrate article命令时,就会报错,说content字段重复了,报错信息如下

django.db.utils.OperationalError: (1060, "Duplicate column name 'content'")

如果发生这种报错信息,解决办法是在migrate命名后添加参数--fake--fake可以将指定的迁移脚本名字添加到数据库中。但是并不会把迁移脚本转换为SQL语句去修改数据库中的表

所以,我们可以执行命名migrate article --fake,会在django_migrations表中插入迁移脚本记录0002_article_content,如下图

Django migrate报错的解决方案

此时数据库中表结构和django中的表结构完全一致,接下来执行迁移命令,就不会报错了

第一种报错情况总结

原因:执行migrate命令会报错的原因是。数据库的django_migrations表中的迁移版本记录和代码中的迁移脚本不一致导致的。
解决办法:使用--fake参数:首先对比数据库中的迁移脚本和代码中的迁移脚本。然后找到哪个不同,之后再使用--fake,将代码中的迁移脚本添加到django_migrations中,但是并不会执行sql语句。这样就可以避免每次执行migrate的时候,都执行一些重复的迁移脚本。

第二种报错情况

如果我们不管怎么执行migrate命令都会报错,那么就执行第二种方案

将出问题的app下的所有模型,都和数据库中的表保持一致。将出问题的app下的所有迁移脚本文件都删掉。再在django_migrations表中将出问题的app相关的迁移记录都删掉。使用makemigrations,重新将模型生成一个迁移脚本。使用migrate --fake-initial参数,将刚刚生成的迁移脚本,标记为已经完成(因为这些模型相对应的表,其实都已经在数据库中存在了,不需要重复执行了。)可以做其他的映射了。

到此这篇关于Django migrate报错的解决方案的文章就介绍到这了,更多相关Django migrate报错内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现根据图标提取分类应用程序实例
Sep 28 Python
Python and、or以及and-or语法总结
Apr 14 Python
Python3 适合初学者学习的银行账户登录系统实例
Aug 08 Python
Laravel+Dingo/Api 自定义响应的实现
Feb 17 Python
python使用thrift教程的方法示例
Mar 21 Python
对Python中class和instance以及self的用法详解
Jun 26 Python
使用OpenCV实现仿射变换—缩放功能
Aug 29 Python
使用Python制作一个打字训练小工具
Oct 01 Python
python virtualenv虚拟环境配置与使用教程详解
Jul 13 Python
Python3 用什么IDE开发工具比较好
Nov 28 Python
selenium判断元素是否存在的两种方法小结
Dec 07 Python
Python实战之实现简易的学生选课系统
May 25 Python
Django使用channels + websocket打造在线聊天室
教你怎么用python爬取爱奇艺热门电影
Pytorch使用shuffle打乱数据的操作
May 20 #Python
教你利用Selenium+python自动化来解决pip使用异常
python 提取html文本的方法
May 20 #Python
学会用Python实现滑雪小游戏,再也不用去北海道啦
pytorch 带batch的tensor类型图像显示操作
You might like
在Windows XP下安装Apache+MySQL+PHP环境
2015/02/22 PHP
PHP+JS三级菜单联动菜单实现方法
2016/02/24 PHP
orm获取关联表里的属性值
2016/04/17 PHP
JavaScript 不只是脚本
2007/05/30 Javascript
js获得鼠标的坐标值的方法
2013/03/13 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
2013/12/06 Javascript
JS去除iframe滚动条的方法
2015/04/01 Javascript
JavaScript中三种异步上传文件方式
2016/03/06 Javascript
jquery之别踩白块游戏的简单实现
2016/07/25 Javascript
Listloading.js移动端上拉下拉刷新组件
2016/08/04 Javascript
jQuery实现的放大镜效果示例
2016/09/13 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
2016/09/20 Javascript
详解使用PM2管理nodejs进程
2017/10/24 NodeJs
使用JS代码实现俄罗斯方块游戏
2018/08/03 Javascript
egg.js的基本使用和调用数据库的方法示例
2019/05/18 Javascript
js+canvas实现纸牌游戏
2020/03/16 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
2020/08/31 Javascript
vue router-link 默认a标签去除下划线的实现
2020/11/06 Javascript
python判断windows隐藏文件的方法
2014/03/21 Python
Python文件夹与文件的相关操作(推荐)
2016/07/25 Python
Python中对象迭代与反迭代的技巧总结
2016/09/17 Python
Python中定时任务框架APScheduler的快速入门指南
2017/07/06 Python
vscode 远程调试python的方法
2017/12/01 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
2018/02/06 Python
安装PyInstaller失败问题解决
2019/12/14 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
2020/02/17 Python
pyspark对Mysql数据库进行读写的实现
2020/12/30 Python
HTML5 语音搜索(淘宝店语音搜素)
2013/01/03 HTML / CSS
京剧自荐信
2014/01/26 职场文书
常务副总经理岗位职责
2014/04/12 职场文书
离婚协议书范本(通用篇)
2014/11/30 职场文书
婚礼答谢礼品
2015/01/20 职场文书
工程项目经理岗位职责
2015/02/02 职场文书
2015年学校信息技术工作总结
2015/05/25 职场文书
Spring实现内置监听器
2021/07/09 Java/Android
SQL Server 中的事务介绍
2022/05/20 SQL Server