Django说MySQL不允许唯一的CharFields的max_length> 255,但确实如此

Amr*_*hit 6 python mysql django

我有一个现有的mysql数据库,包含下表:

CREATE TABLE IF NOT EXISTS NetworkServerGroups (
        GroupID INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
        GroupName VARCHAR(2048) UNIQUE NOT NULL
        )
Run Code Online (Sandbox Code Playgroud)

在运行Django的inspectdb工具之后,它生成了以下模型(我手动修改了类名以删除尾随's'):

class Networkservergroup(models.Model):
    groupid = models.AutoField(db_column='GroupID', primary_key=True)  # Field name made lowercase.
    groupname = models.CharField(db_column='GroupName', unique=True, max_length=2048)  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'NetworkServerGroups'
Run Code Online (Sandbox Code Playgroud)

但是当我来运行测试服务器时,它会抱怨以下错误:

control_panel.Networkservergroup.groupname: (mysql.E001) MySQL does not allow unique CharFields to have a max_length > 255.
Run Code Online (Sandbox Code Playgroud)

但显然,mysql确实支持长度> 255的唯一CharFields,因为使用上面的SQL语句创建的表格非常好.

我该如何解决这个问题?

Ali*_*ton 9

MySql InnoDB表中唯一键的最大长度为767字节,除非您已innodb_large_prefix设置为on,在这种情况下它是3072字节.看到:

https://dev.mysql.com/doc/refman/5.7/en/innodb-restrictions.html

从Mysql 5.7.7开始,innodb_large_prefix默认为on.看到:

https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_large_prefix

所以我猜Django选择保守的选项,因为它适用于Mysql 5.5:

https://docs.djangoproject.com/en/1.11/ref/databases/#version-support

正如@Alasdair在答案中所示,您可以使用SILENCED_SYSTEM_CHECKS设置使此检查无效:

SILENCED_SYSTEM_CHECKS = ['mysql.E001']
Run Code Online (Sandbox Code Playgroud)