Django migrate报错的解决方案
作者:Silent丿丶黑羽 发布时间:2021-05-16 12:48:30
前言
在讲解如何解决migrate
报错原因前,我们先要了解migrate
做了什么事情,migrate
:将新生成的迁移脚本。映射到数据库中。创建新的表或者修改表的结构。
问题1:migrate怎么判断哪些迁移脚本需要执行?
它会将代码中的迁移脚本和数据库中django_migrations
中的迁移脚本进行对比,如果发现数据库中,没有这个迁移脚本,那么就会执行这个迁移脚本。
问题2:migrate做了什么事情
将相关的迁移脚本翻译成SQL语句,在数据库中执行这个SQL语句。
如果这个SQL语句执行没有问题,那么就会将这个迁移脚本的名字记录到
django_migrations
中。
实战案例
当我们了解清楚migrate
的作用后,我们来看一个案例
首先我们创建一个项目orm_migrations_demo
,接着创建2个app应用front
和article
,代码结构如下图
接着在front.models.py
和article.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.py
的INSTALL_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_migrations
表中内容如下:
接下来我们在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_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
中的字段:
从上图中我们可以清楚的看到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_migrations
表中的迁移版本记录和代码中的迁移脚本不一致导致的。
解决办法:使用--fake
参数:首先对比数据库中的迁移脚本和代码中的迁移脚本。然后找到哪个不同,之后再使用--fake
,将代码中的迁移脚本添加到django_migrations
中,但是并不会执行sql语句。这样就可以避免每次执行migrate
的时候,都执行一些重复的迁移脚本。
第二种报错情况
如果我们不管怎么执行migrate
命令都会报错,那么就执行第二种方案
将出问题的app下的所有模型,都和数据库中的表保持一致。将出问题的app下的所有迁移脚本文件都删掉。再在django_migrations
表中将出问题的app相关的迁移记录都删掉。使用makemigrations
,重新将模型生成一个迁移脚本。使用migrate --fake-initial
参数,将刚刚生成的迁移脚本,标记为已经完成(因为这些模型相对应的表,其实都已经在数据库中存在了,不需要重复执行了。)可以做其他的映射了。
来源:https://www.cnblogs.com/jiakecong/p/14789389.html


猜你喜欢
- 本文实例为大家分享了Python版名片管理系统的具体代码,供大家参考,具体内容如下先建立cards_main的文件import cards_
- 对于时间的选择问题,查到的大部分为两种情况:1.存在readonly属性的2.没有readonly属性的可直接赋值send_keys()测试
- 前言最近公司业务服务老出bug,各路大佬盯着链路图找问题找的头昏眼花。某天大佬丢了一张图过来“我们做一个资源拓扑图吧,方便大家找bug”。就
- 序言那个猥琐的家伙整天把个U盘藏着当宝,到睡觉了就拿出来插到电脑上。我决定想个办法看他U盘里都藏了什么,直接去抢U盘是不可能的,骗也是不可能
- upload.htm <html><head><title>网站维护 -
- 这是一个特别简单的用原生js实现的一个小鸟游戏,比较简单,适合新手练习。html结构<div id="game"&
- 这篇文章主要介绍了python re模块匹配贪婪和非贪婪模式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 本文实例讲述了django框架model orM使用字典作为参数,保存数据的方法。分享给大家供大家参考,具体如下:假设有一个字典,里面已经有
- 本文实例讲述了Flask框架 CSRF 保护实现方法。分享给大家供大家参考,具体如下:Flask CSRF 保护为什么需要 CSRF?具体操
- Python 异常处理的实例详解与许多面向对象语言一样,Python 具有异常处理,通过使用 try...except 块来实现。Note:
- 方法一:def dict_to_numpy_method1(dict): dict_sorted=sorted(dict.iteritems
- 环境 python -m venv venvvenv\Scripts\activate 激活环境失败 解决方案输入get-execution
- 在 Go 中,数组和切片的功能其实是类似的,都是用来存储一种类型元素的集合。数组是固定长度的,而切片的长度是可以调整的数组(array)我们
- ///计算两个整数的百分比值 function GetPercent(num, total) { num = parseFloat(num)
- 前言利用Python实现获取动态图表,废话不多说~让我们愉快地开始吧~开发工具Python版本: 3.6.4相关模块:re模块;reques
- 连续活跃登陆的用户指至少连续2天都活跃登录的用户解决类似场景的问题创建数据CREATE TABLE test5active(dt strin
- 问题描述在做矩阵数据的归一化处理时,遇到个报错:ValueError: operands could not be broadcast to
- python爬虫写起来非常快,虽然也可以用java,但是没有python来的简
- 最近经常遇到xmlHttp组件的问题, 今天终于有空将解决过程中的经验整理下来了! ^o^一、在运用xmlhttp组件编
- 本文为 djangorestframework-simplejwt 使用记录。(官方文档) 1. 安装 pip inst