开发背景
公司使用 Flask 进行开发,使用 SQLalchemy ORM 模型,在开发环境中 migrate
和 upgrade
正常通过,但是在部署测试环境的时候报了一行错误:
sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (1071, 'Specified key was too long; max key length is 767 bytes')
根据报错提示可知原因是:指定的密钥太长,最大密钥长度为767字节。这其实是在定义字段的时候,我加上了索引,导致在旧版本的 MySQL 中超出了索引字节的限制。
解决方案
启用系统变量 innodb_large_prefix
,系统变量需满足一下几个条件:
1. 系统变量 innodb_large_prefix 为 ON
2. 系统变量 innodb_file_format 为 Barracuda
3. ROW_FORMAT为DYNAMIC 或 COMPRESSED
还有一种解决方案是使用前缀索引,但是在 SQLalchemy
中我没有找到使用前缀的方式,所以纯 SQL 建议使用前缀索引,SQLalchemy
就乖乖的使用上述的方案吧
参考文章:https://blog.csdn.net/noDr_butTry/article/details/90813327