django model去掉unique_together报错的解决方案


Posted in Python onOctober 18, 2016

事情是这样的,我有一个存储考试的表

class Exam(models.Model):
 category = cached_fields.ForeignKeyField(Category)
 name = models.CharField(max_length=128)
 date = models.DateField()
 created_at = models.DateTimeField(auto_now_add=True)
 updated_at = models.DateTimeField(auto_now=True)

 class Meta:
 unique_together = ('category', 'date')

category 表示考试的类型, date 表示考试的日期。建表的时候考虑到一个类型的考试在同一个应该只有一个考试,所以就加了一个 unique_together 。但是由于业务需要,这个 unique_together 不需要了。

用过 django 的人都知道,这不是个大问题,删掉 unique_together 的代码,然后 makemigrations 呗,确实,我就这么做了。但是当我 migrate 的时候却报错了,错误如下:

django.db.utils.OperationalError: (1553, "Cannot drop index 'insurance_exam_category_id_a430e581_uniq': needed in a foreign key constraint")

数据库不让我删除这个 index ,并且告诉我有一个 外键约束 用到了这个它。我就奇怪了,category是外键没错,但是我这个是 unique_together 啊,怎么可能有哪个外键用到了它呢?

没办法,我只能到数据库里寻找答案, show create table exam ,输出如下:

| insurance_exam | CREATE TABLE `insurance_exam` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(128) NOT NULL,
 `date` date NOT NULL,
 `created_at` datetime(6) NOT NULL,
 `updated_at` datetime(6) NOT NULL,
 `category_id` int(11) NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `insurance_exam_category_id_a430e581_uniq` (`category_id`,`date`),
 CONSTRAINT `insurance_exam_category_id_a2238260_fk_insurance_category_id` FOREIGN KEY (`category_id`) REFERENCES `insurance_category` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1062 DEFAULT CHARSET=utf8mb4 |

可以看到 UNIQUE KEY 那一行就是 unique_together ,下面一行是 category 外键。没有其他东西了啊,到底哪个外键用到了我们的 unique_together

外键只能是 category 了,也没有别的外键啊。到底是怎么回事呢?

原因是这样的: 在Mysql中外键会自动在表上添加一个index ,也就说如果没有unique_together,我们的表应该是这样的:

| insurance_exam | CREATE TABLE `insurance_exam` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(128) NOT NULL,
 `date` date NOT NULL,
 `created_at` datetime(6) NOT NULL,
 `updated_at` datetime(6) NOT NULL,
 `category_id` int(11) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `category_id` (`category_id`),
 CONSTRAINT `insurance_exam_category_id_a2238260_fk_insurance_category_id` FOREIGN KEY (`category_id`) REFERENCES `insurance_category` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1062 DEFAULT CHARSET=utf8mb4 |

但是因为有了 unique_together unique_key ,并且 category 在联合索引的左边,根据 最左前缀 原则, category 的索引就有了,所以就不会另外建索引,这个时候 category 的外键约束就依赖了这个 unique_key ,所以删除的时候会出现那样的报错。

机智的小伙伴应该想到了,如果我们要去掉 unique_together ,我们可以将 category KEY 加回去,这样就可以将 unique_together 删掉了。 sql 如下:

alter table exam add index(category_id);

这样,migrate就能成功了。

Python 相关文章推荐
Python中用于转换字母为小写的lower()方法使用简介
May 19 Python
python使用win32com库播放mp3文件的方法
May 30 Python
Python实现比较两个文件夹中代码变化的方法
Jul 10 Python
Django读取Mysql数据并显示在前端的实例
May 27 Python
python 借助numpy保存数据为csv格式的实现方法
Jul 04 Python
pyqt 实现为长内容添加滑轮 scrollArea
Jun 19 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
Aug 29 Python
python英语单词测试小程序代码实例
Sep 09 Python
Python函数基本使用原理详解
Mar 19 Python
Django ORM filter() 的运用详解
May 14 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
Jan 27 Python
python实现黄金分割法的示例代码
Apr 28 Python
django批量导入xml数据
Oct 16 #Python
python中os模块详解
Oct 14 #Python
python append、extend与insert的区别
Oct 13 #Python
CentOS6.5设置Django开发环境
Oct 13 #Python
Python判断某个用户对某个文件的权限
Oct 13 #Python
python使用str & repr转换字符串
Oct 13 #Python
PYTHON 中使用 GLOBAL引发的一系列问题
Oct 12 #Python
You might like
mysql 性能的检查和优化方法
2009/06/21 PHP
php array_filter除去数组中的空字符元素
2020/06/21 PHP
PHP语法自动检查的Vim插件
2014/08/11 PHP
PHP实现的QQ空间g_tk加密算法
2015/07/09 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
yii2.0框架实现上传excel文件后导入到数据库的方法示例
2020/04/13 PHP
html读出文本文件内容
2007/01/22 Javascript
js报错 Object doesn't support this property or method的原因分析
2011/03/31 Javascript
jQuery javaScript捕获回车事件(示例代码)
2013/11/07 Javascript
利用JavaScript检测CPU使用率自己写的
2014/03/22 Javascript
JavaScript中的正则表达式简明总结
2014/04/04 Javascript
JavaScript中setUTCFullYear()方法的使用简介
2015/06/12 Javascript
js如何实现淡入淡出效果
2020/11/18 Javascript
JQ选择器_选择同类元素的第N个子元素的实现方法
2016/09/08 Javascript
利用BootStrap的Carousel.js实现轮播图动画效果
2016/12/21 Javascript
Vue中添加过渡效果的方法
2017/03/16 Javascript
js学习总结_轮播图之渐隐渐现版(实例讲解)
2017/07/17 Javascript
基于JavaScript实现选项卡效果
2017/07/21 Javascript
在vscode里使用.vue代码模板的方法
2018/04/28 Javascript
vue安装遇到的5个报错及解决方法
2019/06/12 Javascript
微信小程序和H5页面间相互跳转代码实例
2019/09/19 Javascript
layer.open组件获取弹出层页面变量、函数的实例
2019/09/25 Javascript
js实现验证码功能
2020/07/24 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
python利用datetime模块计算时间差
2015/08/04 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
Python注释、分支结构、循环结构、伪“选择结构”用法实例分析
2020/01/09 Python
Pytorch实现LSTM和GRU示例
2020/01/14 Python
世嘉游戏英国官方商店:SEGA Shop UK
2019/09/20 全球购物
密封类可以有虚函数吗
2014/08/11 面试题
LINUX下线程,GDI类的解释
2012/04/17 面试题
大学军训通讯稿
2014/01/13 职场文书
提拔干部考察材料
2014/05/26 职场文书
个人年底工作总结
2015/03/10 职场文书
2015年小学语文工作总结
2015/05/25 职场文书
深入理解pytorch库的dockerfile
2022/06/10 Python