django migrate报错如何解决?这几点要了解
Admin 2021-10-19 群英技术资讯 457 次浏览
django migrate报错如何解决?要解决django migrate报错的问题,首先我们需要了解migrate做了什么事情,了解报错的情况等等这些,因此下面我们一步步来解决django migrate报错的情况。
它会将代码中的迁移脚本和数据库中django_migrations
中的迁移脚本进行对比,如果发现数据库中,没有这个迁移脚本,那么就会执行这个迁移脚本。
问题2:migrate做了什么事情
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
参数,将刚刚生成的迁移脚本,标记为已经完成(因为这些模型相对应的表,其实都已经在数据库中存在了,不需要重复执行了。)可以做其他的映射了。
关于django migrate报错的问题及解决方法就介绍到这,需要的朋友可以了解看看,希望本文能对大家有帮助。想要了解更多django migrate报错的内容,大家可以关注其它的相关文章。
文本转载自脚本之家
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
Django部署到Cenos需要安装大量的依赖包, 有很多坑需要踩,这篇文章主要给大家介绍了关于将django项目部署到centos踩坑的相关资料,需要的朋友可以参考下
python开发中时长到货币格式化的问题,一般情况下可以使用locale模块。但是这个模块使用起来不是那么顺手,今天我为大家介绍一个很好用的方
这篇文章主要介绍了face_recognition库在python的安装,解决了一些没有安装时出现的一些错误,需要的朋友可以参考下
这篇文章主要介绍了推荐五个常用的python图像处理库,文章基于python的相关内容分享图像处理库,具有一定的参考价值,需要的小伙伴可以参考一下
这篇文章主要介绍了python实现三次密码验证的示例,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008