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中zip()函数用法实例教程
Jul 31 Python
python回调函数用法实例分析
May 09 Python
用python写一个windows下的定时关机脚本(推荐)
Mar 21 Python
Python 机器学习库 NumPy入门教程
Apr 19 Python
python抽取指定url页面的title方法
May 11 Python
Python设计模式之备忘录模式原理与用法详解
Jan 15 Python
搞清楚 Python traceback的具体使用方法
May 13 Python
python-tkinter之按钮的使用,开关方法
Jun 11 Python
Python中变量的输入输出实例代码详解
Jul 28 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
Dec 25 Python
Python开发简易五子棋小游戏
May 02 Python
pycharm无法安装cv2模块问题
May 20 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获取网页标题的3种实现方法代码实例
2014/04/11 PHP
3款值得推荐的微信开发开源框架
2014/10/28 PHP
php实现通过soap调用.Net的WebService asmx文件
2017/02/27 PHP
Jqgrid表格随窗口大小改变而改变的简单实例
2013/12/28 Javascript
jQuery $命名冲突解决方案汇总
2014/11/13 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
jQuery实现表格颜色交替显示的方法
2015/03/09 Javascript
javascript中this的四种用法
2015/05/11 Javascript
原生js页面滚动延迟加载图片
2015/12/20 Javascript
mvc中form表单提交的三种方式(推荐)
2016/08/10 Javascript
node.js学习之交互式解释器REPL详解
2016/12/08 Javascript
使用Node.js实现简易MVC框架的方法
2017/08/07 Javascript
vue中使用ueditor富文本编辑器
2018/02/08 Javascript
js事件on动态绑定数据,绑定多个事件的方法
2018/09/15 Javascript
简述ES6新增关键字let与var的区别
2019/08/23 Javascript
vue实现户籍管理系统
2020/05/29 Javascript
详解Vue中Axios封装API接口的思路及方法
2020/10/10 Javascript
Python 面向对象 成员的访问约束
2008/12/23 Python
python制作小说爬虫实录
2017/08/14 Python
Django框架封装外部函数示例
2019/05/28 Python
python 读取数据库并绘图的实例
2019/12/03 Python
详解python tcp编程
2020/08/24 Python
Python使用内置函数setattr设置对象的属性值
2020/10/16 Python
行政文员岗位职责
2013/11/08 职场文书
酒店办公室文员岗位职责
2013/12/18 职场文书
销售员个人求职的自我评价
2014/02/10 职场文书
学徒工职责
2014/03/06 职场文书
阳光体育活动总结
2014/04/30 职场文书
群众路线班子对照检查材料
2014/09/25 职场文书
中学生检讨书范文
2014/11/03 职场文书
社会实践活动总结
2015/02/05 职场文书
盲山观后感
2015/06/11 职场文书
三年级作文之趣事作文
2019/11/04 职场文书
详解Flutter网络请求Dio库的使用及封装
2022/04/14 Java/Android
Python 统计序列中元素的出现频度
2022/04/26 Python
CSS SandBox应用场景及常见问题
2022/06/25 HTML / CSS