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 相关文章推荐
使用C语言来扩展Python程序和Zope服务器的教程
Apr 14 Python
基于Python __dict__与dir()的区别详解
Oct 30 Python
python判断一个数是否能被另一个整数整除的实例
Dec 12 Python
Python 使用 docopt 解析json参数文件过程讲解
Aug 13 Python
python中字典按键或键值排序的实现代码
Aug 27 Python
python字符串判断密码强弱
Mar 18 Python
浅谈Python3中print函数的换行
Aug 05 Python
Django如何实现密码错误报错提醒
Sep 04 Python
Elasticsearch py客户端库安装及使用方法解析
Sep 14 Python
基于python获取本地时间并转换时间戳和日期格式
Oct 27 Python
详解python的super()的作用和原理
Oct 29 Python
Qt自定义Plot实现曲线绘制的详细过程
Nov 02 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 smarty模版引擎中的缓存应用
2009/12/02 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
PHP操作Memcache实例介绍
2013/06/14 PHP
解析VS2010利用VS.PHP插件调试PHP的方法
2013/07/19 PHP
yii2带搜索功能的下拉框实例详解
2016/05/12 PHP
在laravel中实现ORM模型使用第二个数据库设置
2019/10/24 PHP
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
2011/03/03 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
JavaScript中的toDateString()方法使用详解
2015/06/12 Javascript
浅谈Javascript实现继承的方法
2015/07/06 Javascript
jquery UI Datepicker时间控件的使用方法(加强版)
2015/11/07 Javascript
JS定义类的六种方式详解
2016/05/12 Javascript
AngularJS表单和输入验证实例
2016/11/02 Javascript
Vue封装的可编辑表格插件方法
2018/08/28 Javascript
JS实现计算小于非负数n的素数的数量算法示例
2019/02/26 Javascript
基于vue-cli3和element实现登陆页面
2019/11/13 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
2019/11/14 Javascript
非常漂亮的js烟花效果
2020/03/10 Javascript
JavaScript读取本地文件常用方法流程解析
2020/10/12 Javascript
[01:08:43]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第一场 1月9日
2021/03/11 DOTA
python中的不可变数据类型与可变数据类型详解
2018/09/16 Python
Windows下Anaconda2安装NLTK教程
2018/09/19 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
python编写softmax函数、交叉熵函数实例
2020/06/11 Python
在tensorflow以及keras安装目录查询操作(windows下)
2020/06/19 Python
Python常用库Numpy进行矩阵运算详解
2020/07/21 Python
python的setattr函数实例用法
2020/12/16 Python
家庭睡衣和家庭用品:Little Blue House
2018/03/18 全球购物
SIDESTEP荷兰:在线购买鞋子
2019/11/18 全球购物
金融学专科生自我鉴定
2014/02/21 职场文书
党支部活动策划方案
2014/08/18 职场文书
2014年发展党员工作总结
2014/11/12 职场文书
门店店长岗位职责
2015/04/14 职场文书
学生病假条范文
2015/08/17 职场文书
jdbc使用PreparedStatement批量插入数据的方法
2021/04/27 MySQL