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实现识别相似图片小结
Feb 22 Python
基于python实现名片管理系统
Nov 30 Python
Python判断是否json是否包含一个key的方法
Dec 31 Python
在python中使用with打开多个文件的方法
Jan 07 Python
Python中的支持向量机SVM的使用(附实例代码)
Jun 26 Python
Django学习之文件上传与下载
Oct 06 Python
django 实现celery动态设置周期任务执行时间
Nov 19 Python
Python Web静态服务器非堵塞模式实现方法示例
Nov 21 Python
python 求10个数的平均数实例
Dec 16 Python
详解Django中异步任务之django-celery
Nov 05 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
Mar 02 Python
教你怎么用Python生成九宫格照片
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程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
PHP重定向的3种方式
2013/03/07 PHP
PHP实现阳历到农历转换的类实例
2015/03/07 PHP
PHP处理数组和XML之间的互相转换
2016/06/02 PHP
浅谈PHP定义命令空间的几个注意点(推荐)
2016/10/29 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
JavaScript之IE的fireEvent方法详细解析
2013/11/20 Javascript
使用jquery局部刷新(jquery.load)从数据库取出数据
2014/01/22 Javascript
JavaScript通过事件代理高亮显示表格行的方法
2015/05/27 Javascript
jQuery基于ajax实现带动画效果无刷新柱状图投票代码
2015/08/10 Javascript
js变形金刚文字特效代码分享
2015/08/20 Javascript
js鼠标按键事件和键盘按键事件用法实例汇总
2016/10/03 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
2016/10/13 Javascript
Bootstrap基本组件学习笔记之下拉菜单(7)
2016/12/07 Javascript
JavaScript实现格式化字符串函数String.format
2016/12/16 Javascript
JavaScript字符串检索字符的方法
2017/06/23 Javascript
js实现轮播图的两种方式(构造函数、面向对象)
2017/09/30 Javascript
ionic grid(栅格)九宫格制作详解
2018/06/30 Javascript
vue实现打印功能的两种方法
2018/09/07 Javascript
Vue插槽原理与用法详解
2019/03/05 Javascript
Python json 错误xx is not JSON serializable解决办法
2017/03/15 Python
python实现读Excel写入.txt的方法
2018/04/29 Python
Python解析json代码实例解析
2019/11/25 Python
使用python编写一个语音朗读闹钟功能的示例代码
2020/07/14 Python
python tkinter的消息框模块(messagebox,simpledialog)
2020/11/07 Python
css3 border-radius属性详解
2017/07/05 HTML / CSS
详解通过变换矩阵实现canvas的缩放功能
2019/01/14 HTML / CSS
End Clothing美国站:英国男士潮牌商城
2018/04/20 全球购物
iHerb中文官网:维生素、保健品和健康产品
2018/11/01 全球购物
英国亚马逊官方网站:Amazon.co.uk
2019/08/09 全球购物
初一科学教学反思
2014/01/27 职场文书
团委书记的竞聘演讲稿
2014/04/24 职场文书
工作计划范文之财务管理
2019/08/09 职场文书
【js设计模式】SOLID五大设计原则
2022/03/24 Javascript
Win11快速关闭所有广告推荐
2022/04/19 数码科技