django.db.utils.OperationalError: (1071, 'Specified key was too long; max key length is 767 bytes')

環境介紹python

Django (2.1)  Python 3.5.5mysql

mysqlclient (1.4.2.post1)git

Mysql 5.6.28github

RHEL 7.3sql

 

在migrate時候報錯數據庫

 

model代碼以下django

class EnvironmentVariable(models.Model):
    """
    環境變量表
    """
    application = models.ForeignKey(Application, verbose_name="所屬應用", related_name="environment_variables",
                                    on_delete=models.CASCADE)
    key = models.TextField(verbose_name="")
    value = models.TextField(verbose_name="", null=True, blank=True)

 

這個表在migrate時候出現BLOB/TEXT column 'id' used in key specification without a key length"app

BLOB/TEXT不能被用做索引,因此報錯post

 

因而修改key字段spa

key = models.CharField(max_length=255, verbose_name="")

 

而後makemigration 繼續migrate沒問題

 

當修改key的 max_length

key = models.CharField(max_length=1024, verbose_name="鍵")

出現報錯:

django.db.utils.OperationalError: (1071, 'Specified key was too long; max key length is 767 bytes')

 索引用的字段長度不能大於255

 

發現:

表在migrate時候會添加 application_id 和key兩個字段的惟一聯合索引

名:paas_environmentvariable_application_id_key_0838cfb7_uniq        攔位 application_id,key  索引類型 Unique  索引方法BTREE

 

解決:在數據庫表設計裏面去掉攔位key的索引

 觀察了數據庫裏面其它用戶所建立的表都是兩個字段作的惟一聯合索引

 

思考:Django model裏面有個db_index=True 的參數是夠能夠解決中止在migrate時候把key這個字段加入索引

Django所用(傻瓜式,支持多種數據庫類型)數據庫操做模塊在migrate索引添加機制原理分析,最好能分析源代碼

 

參考:

https://github.com/aschn/drf-tracking/issues/29#issuecomment-264030924

https://github.com/victorx98/drf-tracking/commit/efc2350b202d78cc2db9aed2763e381bb84ccae1

 

 

有人在model加了這個

    class Meta:
        unique_together = ("application", "key")
相關文章
相關標籤/搜索