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之编写类之一创建实例
Oct 11 Python
用Python代码来解图片迷宫的方法整理
Apr 02 Python
Python实现从log日志中提取ip的方法【正则提取】
Mar 31 Python
python查看列的唯一值方法
Jul 17 Python
TensorFlow利用saver保存和提取参数的实例
Jul 26 Python
Tensorflow 合并通道及加载子模型的方法
Jul 26 Python
python中matplotlib条件背景颜色的实现
Sep 02 Python
python多进程间通信代码实例
Sep 30 Python
python 实现从高分辨图像上抠取图像块
Jan 02 Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
Apr 20 Python
pytest进阶教程之fixture函数详解
Mar 29 Python
python manim实现排序算法动画示例
Aug 14 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
雄兵连三大错觉:凯莎没了,凉冰阵亡了,华烨觉得自己又行了
2020/04/09 国漫
PHP生成UTF8文件的方法
2010/05/15 PHP
php中获得视频时间总长度的另一种方法
2011/09/15 PHP
php中遍历二维数组并以表格的形式输出的方法
2017/01/03 PHP
json数据的列循环示例
2013/09/06 Javascript
js/jquery判断浏览器的方法小结
2014/09/02 Javascript
jQuery实现简单的DIV拖动效果
2016/02/19 Javascript
javascript self对象使用详解
2016/10/18 Javascript
json的结构与遍历方法实例分析
2017/04/25 Javascript
在vue中使用vue-echarts-v3的实例代码
2018/09/13 Javascript
利用JS如何获取form表单数据
2019/12/19 Javascript
Python入门及进阶笔记 Python 内置函数小结
2014/08/09 Python
python安装与使用redis的方法
2016/04/19 Python
Unicode和Python的中文处理
2017/03/19 Python
Python星号*与**用法分析
2018/02/02 Python
Python实现的凯撒密码算法示例
2018/04/12 Python
Linux上使用Python统计每天的键盘输入次数
2019/04/17 Python
PyQT实现菜单中的复制,全选和清空的功能的方法
2019/06/17 Python
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
酒店实习个人鉴定
2013/12/07 职场文书
临床医师专业个人自我评价
2014/01/08 职场文书
新学期开学寄语
2014/01/18 职场文书
2014年两会学习心得范例
2014/03/17 职场文书
新农村建设典型材料
2014/05/31 职场文书
营销总经理岗位职责范本
2014/09/02 职场文书
法定代表人授权委托书范本
2014/10/07 职场文书
三方股东合作协议书
2014/10/28 职场文书
工作汇报开头与结尾怎么写
2014/11/08 职场文书
医院消毒隔离制度
2015/08/05 职场文书
干部作风纪律整顿心得体会
2016/01/23 职场文书
人事部:年度述职报告范文
2019/07/12 职场文书
《童年》读后感(三篇)
2019/08/27 职场文书
详解MySQL主从复制及读写分离
2021/05/07 MySQL
ES6 解构赋值的原理及运用
2021/05/25 Javascript
5种 JavaScript 方式实现数组扁平化
2021/10/05 Javascript