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使用正则表达式检测密码强度源码分享
Jun 11 Python
python3新特性函数注释Function Annotations用法分析
Jul 28 Python
Python入门_浅谈for循环、while循环
May 16 Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
Dec 12 Python
Python安装lz4-0.10.1遇到的坑
May 20 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
Jan 14 Python
对python中基于tcp协议的通信(数据传输)实例讲解
Jul 22 Python
解决python gdal投影坐标系转换的问题
Jan 17 Python
python如何求数组连续最大和的示例代码
Feb 04 Python
基于python3生成标签云代码解析
Feb 18 Python
python实现移动木板小游戏
Oct 09 Python
Pytorch可视化的几种实现方法
Jun 10 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 无限级数据JSON格式及JS解析
2010/07/17 PHP
php在文件指定行中写入代码的方法
2012/05/23 PHP
MongoDB在PHP中的常用操作小结
2014/02/20 PHP
php递归创建目录的方法
2015/02/02 PHP
PHP PDOStatement::debugDumpParams讲解
2019/01/30 PHP
详解PHP PDO简单教程
2019/05/28 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
2019/10/11 PHP
jquery中html、val与text三者属性取值的联系与区别介绍
2013/12/29 Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
2014/06/06 Javascript
深入分析JSONP跨域的原理
2014/12/10 Javascript
浅谈JavaScript 的执行顺序
2015/08/07 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
2016/05/11 Javascript
jQuery实现的图片轮播效果完整示例
2016/09/12 Javascript
nodejs 图片预览和上传的示例代码
2017/09/30 NodeJs
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
详解vue v-model
2020/08/31 Javascript
带你使用webpack快速构建web项目的方法
2020/11/12 Javascript
[01:54]胎教DOTA2 准妈妈玩家现身中国区预选赛
2016/06/26 DOTA
[00:17]天涯墨客一技能展示
2018/08/25 DOTA
python如何获取服务器硬件信息
2017/05/11 Python
python使用Qt界面以及逻辑实现方法
2019/07/10 Python
pow在python中的含义及用法
2019/07/11 Python
python3中pip3安装出错,找不到SSL的解决方式
2019/12/12 Python
英国莱斯特松木橡木家具网上商店:Choice Furniture Superstore
2019/07/05 全球购物
Maisons du Monde德国:法国家具和装饰的市场领导者
2019/07/26 全球购物
adidas瑞典官方网站:购买阿迪达斯鞋子和运动服
2019/12/11 全球购物
幼儿园实习自我鉴定
2013/12/15 职场文书
市场安全管理制度
2014/01/26 职场文书
小学安全汇报材料
2014/08/14 职场文书
施工安全汇报材料
2014/08/17 职场文书
出纳试用期自我鉴定范文
2014/09/16 职场文书
2014年防汛工作总结
2014/12/08 职场文书
幼儿园中秋节活动总结
2015/03/23 职场文书
孩子满月酒答谢词
2015/09/30 职场文书
numpy数据类型dtype转换实现
2021/04/24 Python
Docker安装MySql8并远程访问的实现
2022/07/07 Servers