摘要
migrate是个厉害的家伙,它会比较编码和数据库中的转移脚本,然后建立新表或改变表结构。但有时候它会出错,让我们很烦恼。
正文
Django(21)migrate出错的解决方法
序言
在解读如何解决migrate出错缘故前,大家先要掌握migrate干了什么事情,migrate:将新转化成的转移脚本制作。投射到数据库查询中。建立新的表或是改动表的构造。
难题1:migrate怎么判断什么转移脚本制作必须实行?
它会将编码中的转移脚本制作和数据库查询中django_migrations中的转移脚本制作开展比照,假如发觉数据库查询中,沒有这一转移脚本制作,那麼便会实行这一转移脚本制作。
难题2:migrate干了什么事情
- 将有关的转移脚本制作译成SQL句子,在数据库查询中实行这一SQL句子。
- 假如这一SQL句子实行没有问题,那麼便会将这一转移脚本制作的名称纪录到
django_migrations中。
实战演练实例
在我们掌握清晰migrate的功效后,大家看来一个实例
最先大家建立一个新项目orm_migrations_demo,然后建立两个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',
]
然后大家开启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指令都是会出错,那麼就实行第二种计划方案
- 将出难题的app下的全部实体模型,都和数据库查询中的表保持一致。
- 将出难题的app下的全部转移脚本文件都删除。再在
django_migrations表里将出难题的app有关的转移纪录都删除。 - 应用
makemigrations,再次将实体模型转化成一个转移脚本制作。 - 应用
migrate --fake-initial主要参数,将刚转化成的转移脚本制作,标识为早已进行(由于这种实体模型相对性应的表,实际上都早已在数据库查询中存有了,不用反复实行了。) - 能够做别的的投射了。
关注不迷路
扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!


评论0