MySQL的Django迁移错误:BLOB / TEXT列' id'用于密钥规范而没有密钥长度"

时间:2016-11-17 03:12:36

标签: python mysql django

我们有Django模型,使用二进制字段作为ID。

# Create your models here.
class Company(models.Model):
    id = models.BinaryField(max_length=16, primary_key=True)
    name = models.CharField(max_length=12)

    class Meta:
        db_table = "company"

我们使用MySQL数据库并在迁移时出错。

  File "/home/cuongtran/Downloads/sample/venv/lib/python3.5/site-packages/MySQLdb/connections.py", line 270, in query
    _mysql.connection.query(self, query)
django.db.utils.OperationalError: (1170, "BLOB/TEXT column 'id' used in key specification without a key length")

你有解决方案吗?我们需要使用MySQL,并希望使用二进制字段作为ID。

谢谢!

1 个答案:

答案 0 :(得分:2)

我认为你无法做到这一点。基于Django文档,看起来二进制字段的使用是discouraged

  

存储原始二进制数据的字段。它只支持字节赋值。   请注意,此字段的功能有限。例如,它是   无法过滤BinaryField值上的查询集。也是   不可能在ModelForm中包含BinaryField。

     

滥用BinaryField

     

虽然您可能会考虑将文件存储在数据库中,但请考虑   在99%的情况下这是糟糕的设计。这个字段不是   替换正确的静态文件处理。

基于Django bug,很可能无法对二进制字段实现unique value限制。此错误标记为wont-fix。我说的很可能是不可能的,因为我没有找到证据确认二进制字段存储为BLOB field,但错误确实暗示了它。

  

说明

     

当我使用这样的字段时:
  text = models.TextField(maxlength=2048, unique=True)
  当管理员应用程序进入表格时,它会导致以下sql错误   _mysql_exceptions.OperationalError: (1170, "BLOB/TEXT column 'text' used in key specification without a key length")
  经过一些调查后发现mysql拒绝对列使用unique,除非它仅用于文本字段的索引部分:

CREATE TABLE `quotes` ( \`id\` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `text` longtext NOT NULL , \`submitTS\` datetime NOT NULL, `submitIP` char(15) NOT NULL, `approved` bool NOT NULL, unique (text(1000)));
     

当然1000只是我选择的任意数字,它恰好是我的数据库允许的最大值。不完全确定如何解决这个问题,但我认为值得一提。