欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

django model去掉unique_together報(bào)錯(cuò)的解決方案

 更新時(shí)間:2016年10月18日 08:38:37   投稿:hebedich  
本文給大家分享的是在使用django model去掉unique_together時(shí)報(bào)錯(cuò)的解決思路和具體步驟,提供給大家參考下,希望對(duì)大家學(xué)習(xí)使用django能夠有所幫助

事情是這樣的,我有一個(gè)存儲(chǔ)考試的表

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 表示考試的日期。建表的時(shí)候考慮到一個(gè)類型的考試在同一個(gè)應(yīng)該只有一個(gè)考試,所以就加了一個(gè) unique_together 。但是由于業(yè)務(wù)需要,這個(gè) unique_together 不需要了。

用過(guò) django 的人都知道,這不是個(gè)大問(wèn)題,刪掉 unique_together 的代碼,然后 makemigrations 唄,確實(shí),我就這么做了。但是當(dāng)我 migrate 的時(shí)候卻報(bào)錯(cuò)了,錯(cuò)誤如下:

復(fù)制代碼 代碼如下:
django.db.utils.OperationalError: (1553, "Cannot drop index 'insurance_exam_category_id_a430e581_uniq': needed in a foreign key constraint")

數(shù)據(jù)庫(kù)不讓我刪除這個(gè) index ,并且告訴我有一個(gè) 外鍵約束 用到了這個(gè)它。我就奇怪了,category是外鍵沒(méi)錯(cuò),但是我這個(gè)是 unique_together 啊,怎么可能有哪個(gè)外鍵用到了它呢?

沒(méi)辦法,我只能到數(shù)據(jù)庫(kù)里尋找答案, 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 外鍵。沒(méi)有其他東西了啊,到底哪個(gè)外鍵用到了我們的 unique_together

外鍵只能是 category 了,也沒(méi)有別的外鍵啊。到底是怎么回事呢?

原因是這樣的: 在Mysql中外鍵會(huì)自動(dòng)在表上添加一個(gè)index ,也就說(shuō)如果沒(méi)有unique_together,我們的表應(yīng)該是這樣的:

| 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 |

但是因?yàn)橛辛?unique_together unique_key ,并且 category 在聯(lián)合索引的左邊,根據(jù) 最左前綴 原則, category 的索引就有了,所以就不會(huì)另外建索引,這個(gè)時(shí)候 category 的外鍵約束就依賴了這個(gè) unique_key ,所以刪除的時(shí)候會(huì)出現(xiàn)那樣的報(bào)錯(cuò)。

機(jī)智的小伙伴應(yīng)該想到了,如果我們要去掉 unique_together ,我們可以將 category KEY 加回去,這樣就可以將 unique_together 刪掉了。 sql 如下:

alter table exam add index(category_id);

這樣,migrate就能成功了。

相關(guān)文章

  • python正則表達(dá)式re模塊的使用示例詳解

    python正則表達(dá)式re模塊的使用示例詳解

    這篇文章主要為大家介紹了python正則表達(dá)式re模塊的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • python遍歷迭代器自動(dòng)鏈?zhǔn)教幚頂?shù)據(jù)的實(shí)例代碼

    python遍歷迭代器自動(dòng)鏈?zhǔn)教幚頂?shù)據(jù)的實(shí)例代碼

    迭代器也是用來(lái)遍歷對(duì)象成員的,下面這篇文章主要給大家介紹了關(guān)于python遍歷迭代器自動(dòng)鏈?zhǔn)教幚頂?shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • 修復(fù) Django migration 時(shí)遇到的問(wèn)題解決

    修復(fù) Django migration 時(shí)遇到的問(wèn)題解決

    本篇文章主要介紹了修復(fù) Django migration 時(shí)遇到的問(wèn)題解決,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • Python代碼中偏函數(shù)的使用詳解

    Python代碼中偏函數(shù)的使用詳解

    Python中的偏函數(shù)是來(lái)自函數(shù)式編程的一個(gè)強(qiáng)大工具,它的主要目標(biāo)是減少函數(shù)調(diào)用的復(fù)雜性,本文將詳細(xì)介紹偏函數(shù)的具體使用,需要的小伙伴可以了解下
    2023-12-12
  • Python使用django框架實(shí)現(xiàn)多人在線匿名聊天的小程序

    Python使用django框架實(shí)現(xiàn)多人在線匿名聊天的小程序

    很多網(wǎng)站都提供了在線匿名聊天的小功能,下面小編基于python的django框架實(shí)現(xiàn)一個(gè)多人在線匿名聊天的小程序,具體實(shí)現(xiàn)代碼大家參考下本文
    2017-11-11
  • Python利用filestools模塊實(shí)現(xiàn)水印添加

    Python利用filestools模塊實(shí)現(xiàn)水印添加

    最近發(fā)現(xiàn)的這款filestools非標(biāo)準(zhǔn)庫(kù)其實(shí)真正實(shí)現(xiàn)添加水印的只要一個(gè)函數(shù)的調(diào)用,一行代碼即可完成水印的添加,感興趣的快跟隨小編一起學(xué)起來(lái)吧
    2022-09-09
  • 淺談Python程序的錯(cuò)誤:變量未定義

    淺談Python程序的錯(cuò)誤:變量未定義

    這篇文章主要介紹了淺談Python程序的錯(cuò)誤:變量未定義,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • python?共現(xiàn)矩陣的實(shí)現(xiàn)代碼

    python?共現(xiàn)矩陣的實(shí)現(xiàn)代碼

    這篇文章主要介紹了python?共現(xiàn)矩陣的實(shí)現(xiàn)代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 舉例講解Python中的Null模式與橋接模式編程

    舉例講解Python中的Null模式與橋接模式編程

    這篇文章主要介紹了Python中的Null模式與橋接模式編程,Null模式與橋接模式都屬于Python的設(shè)計(jì)模式編程,需要的朋友可以參考下
    2016-02-02
  • pandas 快速處理 date_time 日期格式方法

    pandas 快速處理 date_time 日期格式方法

    今天小編就為大家分享一篇pandas 快速處理 date_time 日期格式方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11

最新評(píng)論