開發背景
公司使用 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