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
相关产品推荐
相关产品推荐

