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中list列表的一些进阶使用方法介绍
Aug 15 Python
python框架django基础指南
Sep 08 Python
python 循环遍历字典元素的简单方法
Sep 11 Python
python3中zip()函数使用详解
Jun 29 Python
Python将视频或者动态图gif逐帧保存为图片的方法
Sep 10 Python
利用Python校准本地时间的方法教程
Oct 31 Python
基于python plotly交互式图表大全
Dec 07 Python
python虚拟环境模块venv使用及示例
Mar 04 Python
使用python脚本自动生成K8S-YAML的方法示例
Jul 12 Python
python和C++共享内存传输图像的示例
Oct 27 Python
用Python实现一个打字速度测试工具来测试你的手速
May 28 Python
python小型的音频操作库mp3Play
Apr 24 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函数
2010/02/16 PHP
作为程序员必知的16个最佳PHP库
2015/12/09 PHP
PHP6连接SQLServer2005的三部曲
2016/04/15 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
关于php unset对json_encode的影响详解
2018/11/14 PHP
PHP中检查isset()和!empty()函数的必要性
2019/02/13 PHP
使Ext的Template可以解析二层的json数据的方法
2007/12/22 Javascript
通过js动态操作table(新增,删除相关列信息)
2012/05/23 Javascript
$.get获取一个文件的内容示例代码
2013/09/11 Javascript
js弹窗返回值详解(window.open方式)
2014/01/11 Javascript
回车直接实现点击某按钮的效果即触发单击事件
2014/02/27 Javascript
jQuery实现的一个自定义Placeholder属性插件
2014/08/11 Javascript
JavaScript函数模式详解
2014/11/07 Javascript
JavaScript中数组成员的添加、删除介绍
2014/12/30 Javascript
nw.js实现类似微信的聊天软件
2015/03/16 Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
2015/11/30 Javascript
JavaScript数据结构与算法之链表
2016/01/29 Javascript
基于WebUploader的文件上传js插件
2016/08/19 Javascript
浅谈jQuery双事件多重加载的问题
2016/10/05 Javascript
AngularJS指令用法详解
2016/11/02 Javascript
使用BootStrap实现悬浮窗口的效果
2016/12/13 Javascript
JS敏感词过滤代码
2016/12/23 Javascript
vue-router路由懒加载的实现(解决vue项目首次加载慢)
2018/08/28 Javascript
wx-charts 微信小程序图表插件的具体使用
2019/08/18 Javascript
多个vue子路由文件自动化合并的方法
2019/09/03 Javascript
vue实现文件上传读取及下载功能
2020/11/17 Javascript
JavaScript实现单点登录的示例
2020/09/23 Javascript
基于hashlib模块--加密(详解)
2017/06/21 Python
django 按时间范围查询数据库实例代码
2018/02/11 Python
使用Django的JsonResponse返回数据的实现
2021/01/15 Python
西班牙香水和化妆品连锁店:Druni
2019/05/05 全球购物
父母对孩子的寄语
2014/04/09 职场文书
美术社团活动总结
2014/06/27 职场文书
个人政风行风自查自纠报告
2014/10/21 职场文书
导游词之云南省玉龙雪山
2019/12/19 职场文书
一文搞懂redux在react中的初步用法
2021/06/09 Javascript