You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字段设置字符串默认值:

  1. 临时生效(数据库重启后失效):
SET GLOBAL sql_mode = 'ALLOW_INVALID_JSON';
  1. 永久生效:修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 10:27:45