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写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
Nov 05 Python
使用Python读写文本文件及编写简单的文本编辑器
Mar 11 Python
深入理解NumPy简明教程---数组3(组合)
Dec 17 Python
python使用TensorFlow进行图像处理的方法
Feb 28 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
Dec 06 Python
pandas计数 value_counts()的使用
Jun 24 Python
解决Jupyter notebook中.py与.ipynb文件的import问题
Apr 21 Python
Python 合并拼接字符串的方法
Jul 28 Python
解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题
Sep 17 Python
pandas map(),apply(),applymap()区别解析
Feb 24 Python
anaconda python3.8安装后降级
Jun 11 Python
Python面向对象之内置函数相关知识总结
Jun 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生成静态页面详解
2006/12/05 PHP
set_include_path和get_include_path使用及注意事项
2013/02/02 PHP
PHP生成Gif图片验证码
2013/10/27 PHP
PHP数组相加操作及与array_merge的区别浅析
2016/11/26 PHP
浅谈Laravel模板实体转义带来的坑
2019/10/22 PHP
jquery插件 cluetip 关键词注释
2010/01/12 Javascript
JS 排序输出实现table行号自增前端动态生成的tr
2014/08/13 Javascript
javascript的日期对象、数组对象、二维数组使用说明
2014/12/22 Javascript
JavaScript中逗号运算符介绍及使用示例
2015/03/13 Javascript
jQuery实现商品活动倒计时
2015/10/16 Javascript
基于jQuery实现网页打印功能
2015/12/01 Javascript
js模态对话框使用方法详解
2017/02/16 Javascript
vue模板语法-插值详解
2017/03/06 Javascript
详解JS模块导入导出
2017/12/20 Javascript
在Vue中使用highCharts绘制3d饼图的方法
2018/02/08 Javascript
React中的render何时执行过程
2018/04/13 Javascript
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
2019/01/29 Javascript
使用Vue.observable()进行状态管理的实例代码详解
2019/05/26 Javascript
了解JavaScript表单操作和表单域
2019/05/27 Javascript
微信小程序使用canvas自适应屏幕画海报并保存图片功能
2019/07/25 Javascript
vue实现购物车功能(商品分类)
2020/04/20 Javascript
js简单实现自动生成表格功能示例
2020/06/02 Javascript
[00:12]2018DOTA2亚洲邀请赛 Somnus丶M出阵单挑
2018/04/06 DOTA
[01:27:30]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python实现根据指定端口探测服务器/模块部署的方法
2014/08/25 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
2019/07/12 Python
Python3 解决读取中文文件txt编码的问题
2019/12/20 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
Html5剪切板功能的实现代码
2018/06/29 HTML / CSS
HTML5之SVG 2D入门2—图形绘制(基本形状)介绍及使用
2013/01/30 HTML / CSS
新加坡航空官方网站:Singapore Airlines
2016/10/13 全球购物
ROSEFIELD手表荷兰官方网上商店:北欧极简设计女士腕表品牌
2018/01/24 全球购物
LUISAVIAROMA德国官网:时尚奢侈品牌购物网站
2020/11/12 全球购物
七一党建活动方案
2014/01/28 职场文书
自动一体化专业求职信
2014/03/15 职场文书
内勤主管岗位职责
2014/04/03 职场文书