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 相关文章推荐
合并百度影音的离线数据( with python 2.3)
Aug 04 Python
python控制台中实现进度条功能
Nov 10 Python
python发送邮件功能实现代码
Jul 15 Python
在Python文件中指定Python解释器的方法
Feb 18 Python
Python实现Linux监控的方法
May 16 Python
python判断一个对象是否可迭代的例子
Jul 22 Python
django之状态保持-使用redis存储session的例子
Jul 28 Python
python elasticsearch环境搭建详解
Sep 02 Python
python网络爬虫 Scrapy中selenium用法详解
Sep 28 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
May 17 Python
Python3爬虫中关于中文分词的详解
Jul 29 Python
Python 处理日期时间的Arrow库使用
Aug 18 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 url 加密解密函数代码
2011/08/26 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
使用Apache的rewrite
2021/03/09 Servers
jquery获得option的值和对option进行操作
2013/12/13 Javascript
面向切面编程(AOP)的理解
2015/05/01 Javascript
纯JS实现本地图片预览的方法
2015/07/31 Javascript
jQuery 监控键盘一段时间没输入
2016/04/22 Javascript
浅谈javascript基础之客户端事件驱动
2016/06/10 Javascript
JS实现兼容各种浏览器的获取选择文本的方法【测试可用】
2016/06/21 Javascript
微信小程序 wxapp视图容器 view详解
2016/10/31 Javascript
angular实现IM聊天图片发送实例
2017/05/08 Javascript
angularjs2中父子组件的数据传递的实例代码
2017/07/05 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
Element UI 自定义正则表达式验证方法
2018/09/04 Javascript
vscode配置vue下的es6规范自动格式化详解
2019/03/20 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
纯异步nodejs文件夹(目录)复制功能
2019/09/03 NodeJs
解决微信小程序中的滚动穿透问题
2019/09/16 Javascript
通过实例了解JS执行上下文运行原理
2020/06/17 Javascript
跟老齐学Python之有容乃大的list(4)
2014/09/28 Python
Python切片索引用法示例
2018/05/15 Python
python format 格式化输出方法
2018/07/16 Python
对python的输出和输出格式详解
2018/12/08 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
2018/12/26 Python
PyQt QListWidget修改列表项item的行高方法
2019/06/20 Python
python命名空间(namespace)简单介绍
2019/08/10 Python
爱尔兰橄榄球店:Irish Rugby Store
2019/12/05 全球购物
个人简历自我鉴定
2013/10/11 职场文书
社区十八大感言
2014/01/19 职场文书
主管竞聘书范文
2014/03/31 职场文书
机关门卫的岗位职责
2014/04/29 职场文书
2014年教师德育工作总结
2014/11/10 职场文书
职场领导同事生日简短祝福语
2019/08/06 职场文书
创业计划书之书店
2019/09/10 职场文书
CSS 还能这样玩?奇思妙想渐变的艺术
2021/04/27 HTML / CSS