環境介紹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")