加入收藏 | 设为首页 | 会员中心 | 我要投稿 宁德站长网 (https://www.0593zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

django migrate报错如何处理?这几点要了解

发布时间:2022-04-12 04:44:26 所属栏目:语言 来源:互联网
导读:django migrate报错如何解决?要解决django migrate报错的问题,首先我们需要了解migrate做了什么事情,了解报错的情况等等这些,因此下面我们一步步来解决django migrate报错的情况。 问题1:migrate怎么判断哪些迁移脚本需要执行? 它会将代码中的迁移脚
   django migrate报错如何解决?要解决django migrate报错的问题,首先我们需要了解migrate做了什么事情,了解报错的情况等等这些,因此下面我们一步步来解决django 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中的字段:
  
  此时数据库中表结构和django中的表结构完全一致,接下来执行迁移命令,就不会报错了
  第一种报错情况总结
  原因:执行migrate命令会报错的原因是。数据库的django_migrations表中的迁移版本记录和代码中的迁移脚本不一致导致的。
  解决办法:使用--fake参数:首先对比数据库中的迁移脚本和代码中的迁移脚本。然后找到哪个不同,之后再使用--fake,将代码中的迁移脚本添加到django_migrations中,但是并不会执行sql语句。这样就可以避免每次执行migrate的时候,都执行一些重复的迁移脚本。
  第二种报错情况
  如果我们不管怎么执行migrate命令都会报错,那么就执行第二种方案
 
  将出问题的app下的所有模型,都和数据库中的表保持一致。将出问题的app下的所有迁移脚本文件都删掉。再在django_migrations表中将出问题的app相关的迁移记录都删掉。使用makemigrations,重新将模型生成一个迁移脚本。使用migrate --fake-initial参数,将刚刚生成的迁移脚本,标记为已经完成(因为这些模型相对应的表,其实都已经在数据库中存在了,不需要重复执行了。)可以做其他的映射了。

(编辑:宁德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读