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通过shutil实现快速文件复制的方法
Mar 14 Python
python字典排序实例详解
May 20 Python
django开发教程之利用缓存文件进行页面缓存的方法
Nov 10 Python
利用Hyperic调用Python实现进程守护
Jan 02 Python
Python无损音乐搜索引擎实现代码
Feb 02 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
Python3数据库操作包pymysql的操作方法
Jul 16 Python
Python使用一行代码获取上个月是几月
Aug 30 Python
详解python中TCP协议中的粘包问题
Mar 22 Python
django 中的聚合函数,分组函数,F 查询,Q查询
Jul 25 Python
Python pip安装第三方库实现过程解析
Jul 09 Python
Python2及Python3如何实现兼容切换
Sep 01 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
从PHP的源码中深入了解stdClass类
2014/04/18 PHP
Yii框架创建cronjob定时任务的方法分析
2017/05/23 PHP
jQuery中html()方法用法实例
2014/12/25 Javascript
8个超实用的jQuery功能代码分享
2015/01/08 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
2015/01/22 Javascript
Bootstrap Search Suggest使用例子
2016/12/21 Javascript
原生js实现鼠标跟随效果
2017/02/28 Javascript
React和Vue中监听变量变化的方法
2018/11/14 Javascript
在 Vue-CLI 中引入 simple-mock实现简易的 API Mock 接口数据模拟
2018/11/28 Javascript
利用jsonp解决js读取本地json跨域的问题
2018/12/11 Javascript
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
2019/02/27 jQuery
微信小程序select下拉框实现源码
2019/11/08 Javascript
vue 路由守卫(导航守卫)及其具体使用
2020/02/25 Javascript
javascript canvas实现简易时钟例子
2020/09/05 Javascript
python实现每次处理一个字符的三种方法
2014/10/09 Python
Python建立Map写Excel表实例解析
2018/01/17 Python
Python3的高阶函数map,reduce,filter的示例详解
2019/07/23 Python
Python解析命令行读取参数之argparse模块
2019/07/26 Python
Django ImageFiled上传照片并显示的方法
2019/07/28 Python
djano一对一、多对多、分页实例代码
2019/08/16 Python
Atom Python 配置Python3 解释器的方法
2019/08/28 Python
创建Shapefile文件并写入数据的例子
2019/11/26 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
2020/03/03 Python
python3 循环读取excel文件并写入json操作
2020/07/14 Python
python的链表基础知识点
2020/09/13 Python
python爬虫用request库处理cookie的实例讲解
2021/02/20 Python
Desigual英国官网:在线购买原创服装
2018/03/09 全球购物
竞聘自述材料
2014/08/25 职场文书
计划生育证明格式范本
2014/09/12 职场文书
股东授权委托书范文
2014/09/13 职场文书
教师学习八项规定六项禁令思想汇报
2014/09/27 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
党员检讨书
2014/10/13 职场文书
2015年全国爱眼日活动小结
2015/02/27 职场文书
公安机关起诉意见书
2015/05/20 职场文书
2016年中秋节寄语大全
2015/12/07 职场文书