Django中的“密钥规范中使用的BLOB / TEXT列没有密钥长度”错误

时间:2019-07-12 10:09:07

标签: python django django-models django-2.2 django-mysql

我的Django项目中有以下模型:

class Institution(models.Model):
    name = models.CharField(unique=True, max_length=100, blank=True)
    description = models.TextField(max_length=500, null=True, blank=True)        
    def __str__(self):
        return self.name

当我使用SQLite时,我完全运行了项目,但是当我将数据库引擎更改为Mysql时,出现此错误:

MySQLdb._exceptions.OperationalError: (1170, "BLOB/TEXT column 'name' used in key specification without a key length")

我该怎么办?

2 个答案:

答案 0 :(得分:0)

解决方案非常简单,只需按照他们的步骤操作即可。

1 - Dell all the files in the migration folder
2 - Then run the command "python manage.py makemigrations"
3 - Then run the command "python manage.py migrate"

OR

借助简单的SQL-lite查询来执行此操作 添加索引示例

  

变更表测试添加索引index_name(col1(255),col2(255));

添加唯一索引示例

  

更改表测试添加唯一的index_name(col1(255),col2(255));

答案 1 :(得分:0)

我收到此错误是因为我试图为 TextField 创建索引。我没有注意到我在 TextField 字段中使用了 name,我应该使用 CharField

class myModel(models): 
    name = models.TextField(max_length=80)
   
    class Meta:                                                                                                                              
        indexes = [ models.Index(fields=['name'])]

这是我的解决方案。

首先,我删除了第一次在模型中添加索引时创建的迁移文件并运行 python manage.py makemigrations

其次,我从模型中删除了索引。

class myModel(models): 
    name = models.TextField(max_length=80)

第三,我运行 python manage.py makemigrations。它显示“未检测到任何变化”。

第四,我运行 python manage.py migrate 并没有再次出现错误。

为了成功创建索引,我必须将 TextField 字段更改为 CharField 并再次添加索引。

class myModel(models): 
    name = models.CharField(max_length=80)
   
    class Meta:                                                                                                                              
        indexes = [ models.Index(fields=['name'])]

运行 makemigrationsmigrate 顺利并成功创建索引。