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解决鸡兔同笼问题的方法
Dec 20 Python
在Python的Flask框架下使用sqlalchemy库的简单教程
Apr 09 Python
Python 性能优化技巧总结
Nov 01 Python
利用 Monkey 命令操作屏幕快速滑动
Dec 07 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
Feb 18 Python
Python图像处理之简单画板实现方法示例
Aug 30 Python
Python实现的企业粉丝抽奖功能示例
Jul 26 Python
Python 自由定制表格的实现示例
Mar 20 Python
Python基于模块Paramiko实现SSHv2协议
Apr 28 Python
Python使用lambda抛出异常实现方法解析
Aug 20 Python
Python安装Bs4的多种方法
Nov 28 Python
在 Python 中使用 7zip 备份文件的操作
Dec 11 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
怎么样可以把 phpinfo()屏蔽掉?
2006/11/24 PHP
坏狼php学习 计数器实例代码
2008/06/15 PHP
Yii2 批量插入、更新数据实例
2017/03/15 PHP
Ext对基本类型的扩展 ext,extjs,format
2010/12/25 Javascript
javascript预加载图片、css、js的方法示例介绍
2013/10/14 Javascript
js中iframe调用父页面的方法
2014/10/30 Javascript
Bootstrap每天必学之弹出框(Popover)插件
2016/04/25 Javascript
详解数组Array.sort()排序的方法
2020/05/09 Javascript
浅析webpack 如何优雅的使用tree-shaking(摇树优化)
2017/08/16 Javascript
微信小程序录音与播放录音功能
2017/12/25 Javascript
浅谈vue父子组件怎么传值
2018/07/21 Javascript
node.js实现简单的压缩/解压缩功能示例
2019/11/05 Javascript
JS实现旋转木马轮播图
2020/01/01 Javascript
es6中Promise 对象基本功能与用法实例分析
2020/02/23 Javascript
python类定义的讲解
2013/11/01 Python
Python实现HTTP协议下的文件下载方法总结
2016/04/20 Python
python实现简易通讯录修改版
2018/03/13 Python
python爬取哈尔滨天气信息
2018/07/14 Python
python中字符串内置函数的用法总结
2018/09/13 Python
python实现三维拟合的方法
2018/12/29 Python
Python列表(List)知识点总结
2019/02/18 Python
基于python使用tibco ems代码实例
2019/12/20 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
2020/03/08 Python
如何利用python web框架做文件流下载的实现示例
2020/06/02 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
2020/12/04 Python
Linux系统下升级pip的完整步骤
2021/01/31 Python
印尼穆斯林时尚购物网站:Hijabenka
2016/12/10 全球购物
在SQL Server中创建数据库主要有那种方式
2013/09/10 面试题
几道Java和数据库的面试题
2013/05/30 面试题
Servlet都有哪些方法?主要作用是什么?
2014/03/04 面试题
党的群众路线教育实践活动批评与自我批评
2014/02/16 职场文书
装饰工程师岗位职责
2014/06/08 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书
民主评议党员总结
2014/10/20 职场文书
2014年销售员工作总结
2014/12/01 职场文书
护士自荐信怎么写
2015/03/06 职场文书