django-关于manage.py migrate无效的问题

django-关于manage.py migrate无效的问题

版权声明:本文为博主原创文章,未经博主容许不得转载。 https://blog.csdn.net/qq_25730711/article/details/60327344

问题描述:

已有的model,修改以后,想从新建模,因而将migrations文件夹中除__init__.py以外其余文件都删掉,再次执行如下步骤python manage.py makemigrations确认成功,执行python manage.py migrate,提示No migrations to apply. 表示一脸懵逼。再次修改,指定表名,再次尝试,发现问题依旧,表示二脸懵逼python

排查过程

  1. python manage.py dbshell 进到数据库里面,查看是否表已存在 
    结果:表不存在
  2. 检查migrations文件 
    结果:文件没问题
  3. 百度 google 各类搜,乱投医,各类尝试

解决方案

  1. python manage.py dbshell 进到数据库中,执行delete from django_migrations where app='your_appname';
  2. python manage.py makemigrations(若migrations文件未删除,可不执行这一步)
  3. python manage.py migrate 好啦,大功告成

缘由分析

  1. 查看django_migrations表结构 
    建表语句: 
    CREATE TABLE "django_migrations" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "app" varchar(255) NOT NULL, "name" varchar(255) NOT NULL, "applied" datetime NOT NULL); 
  2. 缘由 
    形成屡次应用migrations失败的缘由是,当前model是修改过的,原来的migrations已经被我删除,可是,从新生成的migrations使用递增整数记名,因此,在django_migrations表中0001,0002等前面几个数字的文件都已被记录,在Django看来,被记录了就至关于已应用,因此,会出现刚开始的No migrations to apply.

避免方案

  1. 有强迫症删除migrations文件的同窗(好比我),请同时到数据库中删除相应记录
  2. 没有强迫症的同窗,能够继续生成新的migrations,旧的就没必要理会了

题外话

执行python manage.py migrate以后,可使用python manage.py sqlmigrate appname migrations_num(例如python manage.py sqlmigrate user 0002)查看当前migrations文件对应的sql语句。 
另外,在使用上述命令查看0002文件的sql语句时发现,django会新建一个表user_new,而后插入user表中的数据,再把user表删掉,再把user_new重命名为user。因此,修改model的时候,没必要担忧原有数据会丢失。sql

相关文章
相关标签/搜索