摘要
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