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 Web框架Pylons中使用MongoDB的例子
Dec 03 Python
Windows系统下使用flup搭建Nginx和Python环境的方法
Dec 25 Python
python实现实时监控文件的方法
Aug 26 Python
Python Django简单实现session登录注销过程详解
Aug 06 Python
python实现ip地址查询经纬度定位详解
Aug 30 Python
Python 寻找局部最高点的实现
Dec 05 Python
如何基于Python实现数字类型转换
Feb 07 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
Jun 24 Python
DRF框架API版本管理实现方法解析
Aug 21 Python
python获取时间戳的实现示例(10位和13位)
Sep 23 Python
Python实现PS滤镜中的USM锐化效果
Dec 04 Python
Python爬取奶茶店数据分析哪家最好喝以及性价比
Sep 23 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
ThinkPHP实现跨模块调用操作方法概述
2014/06/20 PHP
PHP中Array相关函数简介
2016/07/03 PHP
关于Laravel Route重定向的一个注意点
2017/01/16 PHP
PHP后台微信支付和支付宝支付开发
2017/04/28 PHP
Firebug 字幕文件JSON地址获取代码
2009/10/28 Javascript
JS动态获取当前时间,并写到特定的区域
2013/05/03 Javascript
FF IE浏览器修改标签透明度的方法
2014/01/27 Javascript
javascript函数重载解决方案分享
2014/02/19 Javascript
JavaScript学习小结(7)之JS RegExp
2015/11/29 Javascript
JS中script标签defer和async属性的区别详解
2016/08/12 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
详解如何让Express支持async/await
2017/10/09 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
2017/10/21 Javascript
利用Javascript实现一套自定义事件机制
2017/12/14 Javascript
全面介绍vue 全家桶和项目实例
2017/12/27 Javascript
vue获取当前激活路由的方法
2018/03/17 Javascript
vue2.0 移动端实现下拉刷新和上拉加载更多的示例
2018/04/23 Javascript
解决layui中的form表单与button的点击事件冲突问题
2018/08/15 Javascript
Vue.js 十五分钟入门图文教程
2018/09/12 Javascript
Vue.js中 v-model 指令的修饰符详解
2018/12/03 Javascript
vue点击当前路由高亮小案例
2019/09/26 Javascript
微信小程序入门之绘制时钟
2020/10/22 Javascript
vue组件中节流函数的失效的原因和解决方法
2020/12/02 Vue.js
实时获取Python的print输出流方法
2019/01/07 Python
Python Flask框架模板操作实例分析
2019/05/03 Python
基于Python的ModbusTCP客户端实现详解
2019/07/13 Python
Python OpenCV调用摄像头检测人脸并截图
2020/08/20 Python
解决在keras中使用model.save()函数保存模型失败的问题
2020/05/21 Python
Python3实现建造者模式的示例代码
2020/06/28 Python
python如何实现递归转非递归
2021/02/25 Python
中国跨境海淘网站:考拉海购
2016/08/01 全球购物
介绍一下Ruby中的对象,属性和方法
2012/07/11 面试题
银行稽核岗位职责
2015/04/13 职场文书
红楼梦读书笔记
2015/06/25 职场文书
使用 Apache Superset 可视化 ClickHouse 数据的两种方法
2021/07/07 Servers
MySql数据库触发器使用教程
2022/06/01 MySQL