一、django在某个版本中有个bug。数据库表中有一个字符类字段时,在不重命名的情况下,将此字段改为FK外键,django的migrate会失效,无法正常更改字段。

django的表同步机制是,在app目录下生成一个migrations文件,里面按数字0001 0002 0003....开头的文件来记录每次的数据库变化(执行 makemigrations)。

当最新的一条上述文件被执行时(执行migrate),django会对比数据库的表django_migrations中记录和最新的000N文件内容,执行成功后会在此表中生成记录。

当migrate命令失效时,多半是因为数据库表django_migrations内容和migrations中文件内容不一致导致的。

对于类似的情况有如下处理方式:

1、如果数据库字段一切正常与migrations文件中记录一致,只是在执行migrate文件时会报错。

python manage.py migrate --fake

执行此命令的结果是,首先并不执行000N文件的数据结构的变化,但将django_migrations中最新的记录同步为migrations中的最新文件,然后再后续的变化将正常运行。

2、对于数据库字段与migrations文件中记录不一致的情况

a.对于可以接受删库的情况:

python manage.py dbshell #进到数据库中select * from django_migrations where app='appname'; #查看同步的文件记录delete from django_migrations where app='appname'; #删掉历史记录退出数据库rm -rf appname/migrations/   #删掉历史的同步文件
python manage.py makemigrations appname  #重新开始同步数据库
python manage.py migrate

b.不可以接受删库的情况:

方案一

python manage.py dbshell 进到数据库中
手工修改数据库的表列,直到和修改文件完全一致。python manage.py migrate --fake APP_NAME #注意此处必须加APP_NAME,以免将其它待执行的格式文件都fake执行了。忽略执行,但将表置为最新的一条django_migrations,之后就可以继续正常索引表的变化。

方案二

删掉migrations/中和数据库不一致的新文件python manage.py dbshell #进到数据库中select * from django_migrations where app='appname'; #查看同步的文件记录
删掉最新执行的记录,直到和migrations/中已成功执行的文件相匹配。
delete from django_migrations where id=ID;

二、当migrate执行一半,发生错误。导致格式化只执行了一半,剩下的没执行。

Migrations for 'test':test/migrations/0033_auto_20210813_0625.py- Create model PermissionTemplate- Remove field is_admin from siteuser- Add field ali to testsetting  #执行到此处报错了,如ali是FK,且是别的APP中的models- Create model StaffUser

这种情况是因为,执行的第三条增加的字段是FK字段,且ali这个对应的models是其它APP中的,还没有创建。导致文件只执行了一半。

此时即使创建了外表的ali这个models,也无法顺利执行migrate。会报错误PermissionTemplate表已经存在。

此时在django_migrations这个大表中0033_auto_20210813_0625并没有被加入记录。

处理办法:

1.先找到makemigrations执行时列出的要执行变化,如上面代码所示。

2.进入数据库,按从上往下顺序对比数据库的表实际结构,以确定到底数据库到底同步到了哪里。如下

desc test_siteuser; #查看此表的结构,是否已经删掉了is_admin字段。

3.打开0033_auto_20210813_0625.py文件,将已经执行的代码注释掉。注意,注释前先备份文件。

cp 0033_auto_20210813_0625.py  0033_auto_20210813_0625.py.bak
# Generated by Django 3.2.4 on 2021-08-13 06:25from django.db import migrations, models
import django.db.models.deletionclass Migration(migrations.Migration):dependencies = [('app1', '0011_**'),('app2', '__first__'),('test', '0032_***'),]operations = [# migrations.CreateModel(#     name='PermissionTemplate',#     fields=[#         ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),#         ('name', models.CharField(blank=True, max_length=100, null=True, verbose_name='名称')),#         ('permissions', models.TextField(blank=True, null=True, verbose_name='权限|分割')),#         ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),#     ],# ),# migrations.RemoveField(#     model_name='siteuser',#     name='is_admin',# ),migrations.AddField(model_name='joysetting',name='ali',field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='', to='', verbose_name='账号'),),migrations.CreateModel(name='StaffUser',fields=[('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),# ('PermissionTemplate', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='joying.permissiontemplate', verbose_name='管理员权限模板')),],),]

注意,要注释干净。如上述代码的最后一行命令,是已经被注释掉的表,在这里也要注释掉。注意因为此时是FK,会出现下面的6小节的问题。

4.执行此变化。

python3 manage.py migrate

5.将0033_auto_20210813_0625.py文件的注释全部去掉,回复原状。

6.如果以下这种情况

ValueError: Related model 'test.permissiontemplate' cannot be resolved

那么可以采取两种方式:

a.方式一

删掉数据库中permissiontemplate,然后将0033_auto_20210813_0625.py中原来注释的创建permissiontemplate部分打开。重新执行python3 manage.py migrate。

b.方式二

将0033_auto_20210813_0625.py中原来注释的创建permissiontemplate部分复制到前一个文件如0032_***.py中。再执行python3 manage.py migrate。

注意,无论采取何种方式执行成功后,最好恢复0032_***.py和0033_auto_20210813_0625.py等原文件。

django migrate 失效/报错相关推荐

  1. Django连接Mysql报错:ModuleNotFoundError: No module named 'MySQLdb'

    Django连接Mysql报错 环境:Django_1.11.8 与 Python_3.6 ModuleNotFoundError: No module named 'MySQLdb' django. ...

  2. django常见启动报错总结

    django常见启动报错 django启动报错:assert queryset is not None, 'basename argument not specified, and could bas ...

  3. Django安装mysqlclient报错的问题

    Django安装mysqlclient报错的问题 ERROR: Command errored out with exit status 1: python setup.py egg_info Che ...

  4. django的页面报错中出现xxxx.html (Skipped)

    完整报错如下: Using engine django: django.template.loaders.filesystem.Loader: /home/appleyuchi/桌面/Python新手 ...

  5. 关于shiro session失效报错问题

    最近做了一个项目,要用到shiro,做完之后发现有个异常经常发生org.apache.shiro.session.UnknownSessionException: There is no sessio ...

  6. django连接MySQL报错Did you install mysqlclient?

    由于项目需求得安装pytorch,但当时想着这个配了老半天,就在原本pytorch环境下安装了django,之后运行报下面错误 django.core.exceptions.ImproperlyCon ...

  7. vue 3.0 keep-alive 失效 报错 Cannot read properties of null (reading ‘parentNode‘)

    版本: vue "3.2.4" vue-loader "16.4.1" vue-router "4.0.11" <router-vie ...

  8. Angular在FormGroup中使用ngModel失效报错问题的解决办法

    在FormGroup中使用ngModel报错解决办法: 一行代码就搞定了,在input标签中添加即可:[ngModelOptions]="{standalone: true}" 示 ...

  9. django进入admin报错ORA-00918:column ambiguously defined

    运行创建好的django项目,以"http://127.0.0.1"访问,成功显示小火箭页面,但当访问"http://127.0.0.1/admin"时报错,错 ...

最新文章

  1. Ansible第一篇:基础
  2. xp系统怎么连接云服务器,xp系统怎么连接云服务器
  3. Ubuntu常用终端快捷键
  4. 计算机强化课程计算机网络,大学计算机网络技术课程教学改革
  5. MySQL学习(四)
  6. AIM Tech Round 4 (Div. 2)ABCD
  7. 字节 字符 utf-8 unicode 以及提交表单验证字符长度 .......
  8. 【数据结构总结】第三章:栈和队列(线性结构)
  9. python 封装_Python 面向对象三大特性之封装
  10. linux+listen错误,linux listen()
  11. python中while的特点_Python【2】:初入python 用户输入,if,(while 循环)
  12. win10 SqlServer2008 卸载 亲测可行
  13. keras深度学习之猫狗分类三(特征提取)
  14. 攻防世界mobile新手区之app3 write up
  15. java怎么输出无损高清音乐_MP3转换器如何将无损FLAC音频转换成MP3音乐
  16. 通过追女孩时的常见对话来看你会不会聊天
  17. 【裸眼3D图】自制图1
  18. html怎么设置左侧内边距,CSS 内边距(Padding)
  19. 音视频开发(十九):运算符重载、继承、多态、模版
  20. Vue.use 写多个_做好4件事,周记不难写

热门文章

  1. 手机拍照软件for android1.6,画画相机软件
  2. 苹果怎么关位置定位服务器,iphone的定位服务在哪里
  3. 微信分享显示分享标题及小图标 前端代码
  4. 支持DX12的DeepFaceLab(DeepFake)新版本除了CUDA也可以用A卡啦
  5. Oracle 报错 ORA-01461
  6. 帮企业省钱,让个人经营者更合规,灵活用工系统开发未来可期!
  7. 一文掌握流程管理与流程优化方法和工具
  8. laya龙骨换装_DragonBones 5.3 新特性详解
  9. 兰卡斯特大学研究人员开发电信量子技术专利
  10. pycharm中import caffe/caffe2