我有一个现有的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语句创建了表格。
如何解决这个问题?
答案 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个。