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中使用hashlib模块处理算法的教程
Apr 28 Python
python获取从命令行输入数字的方法
Apr 29 Python
Python使用Mechanize模块编写爬虫的要点解析
Mar 31 Python
在cmd中运行.py文件: python的操作步骤
May 12 Python
python3.6实现学生信息管理系统
Feb 21 Python
Opencv实现抠图背景图替换功能
May 21 Python
Python基础学习之函数方法实例详解
Jun 18 Python
用pyqt5 给按钮设置图标和css样式的方法
Jun 24 Python
Python generator生成器和yield表达式详解
Aug 08 Python
Python基础类继承重写实现原理解析
Apr 03 Python
python模拟实现分发扑克牌
Apr 22 Python
将Python代码打包成.exe可执行文件的完整步骤
May 12 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
海贼王:最美的悬赏令!
2020/03/02 日漫
php smarty的预保留变量总结
2008/12/04 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
2016/01/08 PHP
PHP实现腾讯短网址生成api接口实例
2020/12/08 PHP
JavaScript 应用类库代码
2008/06/02 Javascript
基于Jquery制作的幻灯片图集效果打包下载
2011/02/12 Javascript
基于jquery DOM写的类似微博发布的效果
2012/10/20 Javascript
$.get获取一个文件的内容示例代码
2013/09/11 Javascript
javascript实现window.print()去除页眉页脚
2014/12/30 Javascript
NodeJS学习笔记之Connect中间件应用实例
2015/01/27 NodeJs
jQuery实现自动输入email、时间和域名的方法
2016/08/24 Javascript
AngularJS删除路由中的#符号的方法
2016/09/20 Javascript
一个非常好用的文字滚动的案例,鼠标悬浮可暂停[两种方案任选]
2016/12/01 Javascript
jquery select2的使用心得(推荐)
2016/12/04 Javascript
JavaScript获取ul中li个数的方法
2017/02/13 Javascript
Angular.JS中的指令引用template与指令当做属性详解
2017/03/30 Javascript
Vue实现购物车功能
2017/04/27 Javascript
Angular项目中$scope.$apply()方法的使用详解
2017/07/26 Javascript
基于axios封装fetch方法及调用实例
2018/02/05 Javascript
JS散列表碰撞处理、开链法、HashTable散列示例
2019/02/08 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
2019/03/11 Javascript
[43:41]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
python中os操作文件及文件路径实例汇总
2015/01/15 Python
python搜索指定目录的方法
2015/04/29 Python
Python切片知识解析
2016/03/06 Python
Python3 jupyter notebook 服务器搭建过程
2018/11/30 Python
使用python实现离散时间傅里叶变换的方法
2019/09/02 Python
10行Python代码实现Web自动化管控的示例代码
2020/08/14 Python
python中的列表和元组区别分析
2020/12/30 Python
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
汇智创新科技发展有限公司
2015/12/06 面试题
求职信名称怎么写
2014/05/26 职场文书
任命书格式
2014/06/05 职场文书
毕业实习指导教师评语
2014/12/31 职场文书
高中生思想道德自我评价
2015/03/09 职场文书
MongoDB数据库常用的10条操作命令
2021/06/18 MongoDB