Sequelize v6中queryInterface添加列时defaultValue不生效问题
解决Sequelize v6给MariaDB表添加TEXT类型列默认值不生效的问题
问题原因
MariaDB中,TEXT类型字段默认不支持直接设置字符串默认值(除非开启特定SQL模式),而Sequelize默认不会自动适配这个数据库限制,导致配置的defaultValue: '[]'无法在数据库层面生成对应默认值。
解决方案
方案1:改用JSON类型(推荐)
如果payload存储的是JSON格式数据,直接替换为DataTypes.JSON类型,MariaDB对JSON类型的默认值支持更完善,且能自动校验JSON格式合法性:
await queryInterface.addColumn('inventories', 'payload', { type: DataTypes.JSON, allowNull: false, defaultValue: [], // 直接传入数组,Sequelize会自动转为JSON格式默认值 });
方案2:开启MariaDB的ALLOW_INVALID_JSON模式
若必须保留TEXT类型,需修改MariaDB的SQL模式,允许TEXT字段设置字符串默认值:
- 临时生效(数据库重启后失效):
SET GLOBAL sql_mode = 'ALLOW_INVALID_JSON';
- 永久生效:修改
my.cnf(或my.ini)配置文件,添加以下配置后重启MariaDB:
[mysqld] sql_mode = ALLOW_INVALID_JSON
完成后重新执行迁移脚本,defaultValue: '[]'即可正常生效。
方案3:直接执行原生SQL语句
绕过Sequelize的字段类型限制,用原生SQL完成列添加操作:
await queryInterface.sequelize.query(` ALTER TABLE inventories ADD COLUMN payload TEXT NOT NULL DEFAULT '[]'; `);
验证方式
执行迁移后,登录MariaDB执行以下命令查看表结构,确认payload列的Default值为[]即可:
DESCRIBE inventories;
内容的提问来源于stack exchange,提问作者Nils van Lück
相关产品推荐
相关产品推荐

