Django说MySQL不允许使用唯一的CharFields来获得max_length> 255,但确实如此

时间:2017-07-21 08:56:56

标签: python mysql django

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

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

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

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'

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

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

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

如何解决这个问题?

2 个答案:

答案 0 :(得分:8)

MySql InnoDB表中唯一键的最大长度为767字节,除非您设置了innodb_large_prefix,在这种情况下它是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']

答案 1 :(得分:2)

您可以使用SILENCED_SYSTEM_CHECKS设置关闭项目中的警告:

static void test0(void)
{
    printf("%s [%d]\n", __func__, __LINE__);
}

static void test0(int a)
{
    printf("%s [%d] %d\n", __func__, __LINE__, a);
}


static std::map<std::string, void*> getAddressMap()
{
    std::map<std::string, void*> addressmap;

    void (*select1)(void) = test0;  // will match void(void)
    addressmap["test0"]=reinterpret_cast<void *>(select1);

    void (*select2)(int) = test0;   // will match void(int)
    addressmap["test0"]=reinterpret_cast<void *>(select2);
    return addressmap;
}

如果255限制仅适用于旧版本的Django或在某些情况下,那么可能应该修改或删除检查。 django-developers邮件列表是一个讨论这个问题的好地方。我不熟悉MySQL所以我不知道长度> 1的独特CharFields的情况。允许255个。