Django迁移的烦恼

摘要

migrate是个厉害的家伙,它会比较编码和数据库中的转移脚本,然后建立新表或改变表结构。但有时候它会出错,让我们很烦恼。

正文

Django(21)migrate出错的解决方法

序言

在解读如何解决migrate出错缘故前,大家先要掌握migrate干了什么事情,migrate:将新转化成的转移脚本制作。投射到数据库查询中。建立新的表或是改动表的构造。
 

难题1:migrate怎么判断什么转移脚本制作必须实行?

它会将编码中的转移脚本制作和数据库查询中django_migrations中的转移脚本制作开展比照,假如发觉数据库查询中,沒有这一转移脚本制作,那麼便会实行这一转移脚本制作。
 

难题2:migrate干了什么事情

  1. 将有关的转移脚本制作译成SQL句子,在数据库查询中实行这一SQL句子。
  2. 假如这一SQL句子实行没有问题,那麼便会将这一转移脚本制作的名称纪录到django_migrations中。
     

实战演练实例

在我们掌握清晰migrate的功效后,大家看来一个实例
最先大家建立一个新项目orm_migrations_demo,然后建立两个app应用frontarticle,编码构造如下图

然后在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',
]

然后大家开启cmd,键入makemigrations article,再键入makemigrations front,这时两个app文件目录上都会发生转移文档0001_initial.py,这时数据库查询中是沒有表的,由于都还没实行转移指令
然后大家实行migrate article,再键入migrate front,migrate发觉数据库查询中沒有转移脚本制作,那麼便会实行刚刚转化成的两个转移脚本制作,将转移脚本制作译成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指令都是会出错,那麼就实行第二种计划方案

  1. 将出难题的app下的全部实体模型,都和数据库查询中的表保持一致。
  2. 将出难题的app下的全部转移脚本文件都删除。再在django_migrations表里将出难题的app有关的转移纪录都删除。
  3. 应用makemigrations,再次将实体模型转化成一个转移脚本制作。
  4. 应用migrate --fake-initial主要参数,将刚转化成的转移脚本制作,标识为早已进行(由于这种实体模型相对性应的表,实际上都早已在数据库查询中存有了,不用反复实行了。)
  5. 能够做别的的投射了。

关注不迷路

扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!

温馨提示:如果您访问和下载本站资源,表示您已同意只将下载文件用于研究、学习而非其他用途。
文章版权声明 1、本网站名称:宇凡盒子
2、本站文章未经许可,禁止转载!
3、如果文章内容介绍中无特别注明,本网站压缩包解压需要密码统一是:yufanbox.com
4、本站仅供资源信息交流学习,不保证资源的可用及完整性,不提供安装使用及技术服务。点此了解
5、如果您发现本站分享的资源侵犯了您的权益,请及时通知我们,我们会在接到通知后及时处理!提交入口
0

评论0

请先

站点公告

🚀 【宇凡盒子】全网资源库转储中心

👉 注册即送VIP权限👈

👻 全站资源免费下载✅,欢迎注册!

记得 【收藏】+【关注】 谢谢!~~~

立即注册
没有账号?注册  忘记密码?

社交账号快速登录