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 Shell获取hostname和fqdn释疑
Jan 25 Python
python 列表降维的实例讲解
Jun 28 Python
Python将一个Excel拆分为多个Excel
Nov 07 Python
python重试装饰器的简单实现方法
Jan 31 Python
Python全栈之列表数据类型详解
Oct 01 Python
python 两个数据库postgresql对比
Oct 21 Python
Django 实现Admin自动填充当前用户的示例代码
Nov 18 Python
Tensorflow 多线程与多进程数据加载实例
Feb 05 Python
python图形界面开发之wxPython树控件使用方法详解
Feb 24 Python
Pytorch中的自动求梯度机制和Variable类实例
Feb 29 Python
Python预测2020高考分数和录取情况
Jul 08 Python
Python尾递归优化实现代码及原理详解
Oct 09 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往windows中添加用户
2006/12/06 PHP
PHP高级OOP技术演示
2009/08/27 PHP
破解图片防盗链的代码(asp/php)测试通过
2010/07/02 PHP
破解.net程序(dll文件)编译和反编译方法
2013/01/31 PHP
PHP将XML转数组过程详解
2013/11/13 PHP
php初始化对象和析构函数的简单实例
2014/03/11 PHP
PHP记录搜索引擎蜘蛛访问网站足迹的方法
2015/04/15 PHP
php计算整个目录大小的方法
2015/06/19 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
jquery的each方法使用示例分享
2014/03/25 Javascript
js子页面获取父页面数据示例
2014/05/15 Javascript
js限制文本框只能输入数字方法小结
2014/06/16 Javascript
javascript实现C语言经典程序题
2015/11/29 Javascript
Angularjs 自定义服务的三种方式(推荐)
2016/08/02 Javascript
vue组件详解之使用slot分发内容
2018/04/09 Javascript
vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)
2018/10/24 Javascript
React服务端渲染原理解析与实践
2021/03/04 Javascript
python 连接sqlite及简单操作
2017/06/30 Python
Pycharm技巧之代码跳转该如何回退
2017/07/16 Python
python机器学习之神经网络(一)
2017/12/20 Python
python实现画一颗树和一片森林
2018/06/25 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
2019/02/07 Python
Python numpy中矩阵的基本用法汇总
2019/02/12 Python
python无序链表删除重复项的方法
2020/01/17 Python
基于python实现FTP文件上传与下载操作(ftp&sftp协议)
2020/04/01 Python
基于python图像处理API的使用示例
2020/04/03 Python
Jupyter notebook 启动闪退问题的解决
2020/04/13 Python
快速了解Python开发环境Spyder
2020/06/29 Python
详细分析Python collections工具库
2020/07/16 Python
python 逆向爬虫正确调用 JAR 加密逻辑
2021/01/12 Python
CSS3之背景尺寸Background-size使用介绍
2013/10/14 HTML / CSS
C++的几个面试题附答案
2016/08/03 面试题
四年级学生评语大全
2014/04/21 职场文书
乡镇三严三实学习心得体会
2014/10/13 职场文书
离职证明格式样本
2015/06/12 职场文书
经典哲理警句:志不真则心不热,心不热则功不贤
2019/11/14 职场文书