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批量重命名同一文件夹下文件的方法
May 25 Python
Python中的数学运算操作符使用进阶
Jun 20 Python
Python首次安装后运行报错(0xc000007b)的解决方法
Oct 18 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
Dec 20 Python
Python创建或生成列表的操作方法
Jun 19 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
Jun 25 Python
对python中的os.getpid()和os.fork()函数详解
Aug 08 Python
在Python中获取操作系统的进程信息
Aug 27 Python
Python3多线程版TCP端口扫描器
Aug 31 Python
解决os.path.isdir() 判断文件夹却返回false的问题
Nov 29 Python
浅谈keras 的抽象后端(from keras import backend as K)
Jun 16 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
Jan 08 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
php截取中文字符串不乱码的方法
2013/12/25 PHP
PHP实现恶意DDOS攻击避免带宽占用问题方法
2015/05/27 PHP
php文件上传及下载附带显示文件及目录功能
2017/04/27 PHP
PHP生成腾讯云COS接口需要的请求签名
2018/05/20 PHP
Javascript常用字符串判断函数代码分享
2014/12/08 Javascript
JS实现网页标题随机显示名人名言的方法
2015/11/03 Javascript
详解JavaScript数组和字符串中去除重复值的方法
2016/03/07 Javascript
基于javascript制作微博发布栏效果
2016/04/04 Javascript
js/jq仿window文件夹框选操作插件
2017/03/08 Javascript
javascript 中的继承实例详解
2017/05/05 Javascript
JS实现加载时锁定HTML页面元素的方法
2017/06/24 Javascript
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
javascript帧动画(实例讲解)
2017/09/02 Javascript
Angular表格神器ui-grid应用详解
2017/09/29 Javascript
IntelliJ IDEA 安装vue开发插件的方法
2017/11/21 Javascript
jQuery中的$是什么意思及 $. 和 $().的区别
2018/04/20 jQuery
微信小程序实现单列下拉菜单效果
2019/04/25 Javascript
vue 更改连接后台的api示例
2019/11/11 Javascript
[02:41]DOTA2英雄基础教程 谜团
2013/12/10 DOTA
Python程序设计入门(5)类的使用简介
2014/06/16 Python
python操作gmail实例
2015/01/14 Python
Python创建系统目录的方法
2015/03/11 Python
Python函数返回值实例分析
2015/06/08 Python
Python模块文件结构代码详解
2018/02/03 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
解决Pycharm的项目目录突然消失的问题
2020/01/20 Python
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
地球上最先进的胡子和头发修剪器:Bevel
2018/01/23 全球购物
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
历史学专业推荐信
2013/11/06 职场文书
八年级语文教学反思
2014/02/11 职场文书
奥巴马的演讲稿
2014/05/15 职场文书
环境科学专业求职信
2014/08/04 职场文书
MySQL分库分表与分区的入门指南
2021/04/22 MySQL
Python可视化神器pyecharts之绘制箱形图
2022/07/07 Python
ubuntu如何搭建vsftpd服务器
2022/12/24 Servers