django migrate 失效/报错
一、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 失效/报错相关推荐
- Django连接Mysql报错:ModuleNotFoundError: No module named 'MySQLdb'
Django连接Mysql报错 环境:Django_1.11.8 与 Python_3.6 ModuleNotFoundError: No module named 'MySQLdb' django. ...
- django常见启动报错总结
django常见启动报错 django启动报错:assert queryset is not None, 'basename argument not specified, and could bas ...
- Django安装mysqlclient报错的问题
Django安装mysqlclient报错的问题 ERROR: Command errored out with exit status 1: python setup.py egg_info Che ...
- django的页面报错中出现xxxx.html (Skipped)
完整报错如下: Using engine django: django.template.loaders.filesystem.Loader: /home/appleyuchi/桌面/Python新手 ...
- 关于shiro session失效报错问题
最近做了一个项目,要用到shiro,做完之后发现有个异常经常发生org.apache.shiro.session.UnknownSessionException: There is no sessio ...
- django连接MySQL报错Did you install mysqlclient?
由于项目需求得安装pytorch,但当时想着这个配了老半天,就在原本pytorch环境下安装了django,之后运行报下面错误 django.core.exceptions.ImproperlyCon ...
- 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 ...
- Angular在FormGroup中使用ngModel失效报错问题的解决办法
在FormGroup中使用ngModel报错解决办法: 一行代码就搞定了,在input标签中添加即可:[ngModelOptions]="{standalone: true}" 示 ...
- django进入admin报错ORA-00918:column ambiguously defined
运行创建好的django项目,以"http://127.0.0.1"访问,成功显示小火箭页面,但当访问"http://127.0.0.1/admin"时报错,错 ...
最新文章
- Ansible第一篇:基础
- xp系统怎么连接云服务器,xp系统怎么连接云服务器
- Ubuntu常用终端快捷键
- 计算机强化课程计算机网络,大学计算机网络技术课程教学改革
- MySQL学习(四)
- AIM Tech Round 4 (Div. 2)ABCD
- 字节 字符 utf-8 unicode 以及提交表单验证字符长度 .......
- 【数据结构总结】第三章:栈和队列(线性结构)
- python 封装_Python 面向对象三大特性之封装
- linux+listen错误,linux listen()
- python中while的特点_Python【2】:初入python 用户输入,if,(while 循环)
- win10 SqlServer2008 卸载 亲测可行
- keras深度学习之猫狗分类三(特征提取)
- 攻防世界mobile新手区之app3 write up
- java怎么输出无损高清音乐_MP3转换器如何将无损FLAC音频转换成MP3音乐
- 通过追女孩时的常见对话来看你会不会聊天
- 【裸眼3D图】自制图1
- html怎么设置左侧内边距,CSS 内边距(Padding)
- 音视频开发(十九):运算符重载、继承、多态、模版
- Vue.use 写多个_做好4件事,周记不难写
热门文章
- 手机拍照软件for android1.6,画画相机软件
- 苹果怎么关位置定位服务器,iphone的定位服务在哪里
- 微信分享显示分享标题及小图标 前端代码
- 支持DX12的DeepFaceLab(DeepFake)新版本除了CUDA也可以用A卡啦
- Oracle 报错 ORA-01461
- 帮企业省钱,让个人经营者更合规,灵活用工系统开发未来可期!
- 一文掌握流程管理与流程优化方法和工具
- laya龙骨换装_DragonBones 5.3 新特性详解
- 兰卡斯特大学研究人员开发电信量子技术专利
- pycharm中import caffe/caffe2