1. 程式人生 > >django.db.utils.OperationalError: (1071, 'Specified key was too long; max key length is 767 bytes')

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

tree 大於 val pos 做的 let cat div ble

環境介紹

Django (2.1) Python 3.5.5

mysqlclient (1.4.2.post1)

Mysql 5.6.28

RHEL 7.3

在migrate時候報錯

model代碼如下

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"

BLOB/TEXT不能被用作索引,所以報錯

於是修改key字段

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

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