You need to enable JavaScript to run this app. Knex.js操作MySQL添加json/jsonb列时触发ER_WRONG_VALUE_COUNT_ON_ROW错误
优惠活动
大模型
产品
解决方案
定价
更多

Knex.js操作MySQL添加json/jsonb列时触发ER_WRONG_VALUE_COUNT_ON_ROW错误

问题根因定位
  • 触发ER_WRONG_VALUE_COUNT_ON_ROW报错的核心原因是跨数据库使用了专属类型定义方法:jsonb是PostgreSQL独有的列类型,Knex中对应的table.jsonb()方法仅在PG连接下能生成合法的建表语句。
  • 你当前项目明确使用MySQL驱动(依赖配置中仅安装了mysql包,无PostgreSQL相关依赖),Knex 0.21.12版本在MySQL连接下执行jsonb()列定义时,会生成MySQL无法正确解析的建表语句,最终导致实际创建的表结构和代码定义的列数不匹配,直接触发列数与值数不匹配的错误。
  • 你之前参考的需要对JSON值做JSON.stringify()的规则,仅针对PostgreSQL环境下的数组传值兼容问题,和当前MySQL场景无关联。MySQL从5.7版本开始原生支持JSON类型,驱动会自动完成序列化处理,不需要手动做字符串转换。

对应修复操作

  • 将迁移脚本中的table.jsonb("error").notNullable()替换为table.json("error").notNullable()

    Knex的.json()方法会根据当前连接的数据库类型自动适配列定义:在MySQL下映射为原生JSON类型,在PostgreSQL环境下如果需要jsonb存储,才需要单独指定对应方法,不能跨数据库硬调用PG专属的列定义方法。

  • 执行修复前先确认旧的异常表已经被删除:如果之前已经运行过带jsonb定义的迁移脚本,需要先手动删除foo表,再执行修改后的迁移,避免基于异常的旧表结构触发报错。
  • 种子数据中删除手动赋值的id: 1字段,让自增主键自动生成值,避免后续出现主键冲突问题。
  • 提前确认本地/线上MySQL版本为5.7及以上:如果使用更低版本的MySQL,需要将该列替换为text类型,手动在业务层处理JSON的序列化与反序列化。

内容的提问来源于stack exchange,提问作者PrinceJelly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.08 17:24:04