为什么Sequelize中model.dataValues返回的数据与定义的模型不一致?
问题原因排查列表
- 数据库表实际字段名不匹配
优先确认你的数据库中supplier_catalog表的真实字段名,很大概率是你写迁移脚本时字段名就写错为minimum_reseller_mark,即使重新执行迁移也不会修正,因为迁移脚本本身的字段定义是错的。你可以直接在数据库执行表结构查询语句确认:
如果确认表字段名是短的那个,你需要新写一个修改字段名的迁移脚本修正,或者删表后重新跑正确的迁移。DESC supplier_catalog;- 数据库表实际字段名不匹配
- Sequelize 字段映射配置问题
如果你数据库里字段名确实是minimum_reseller_markup,那就是Sequelize的字段映射规则导致的转换错误:
- 检查你初始化Sequelize实例时的全局
define配置,是否开启了自定义字段名转换规则、或者开启了错误的自动缩写/截断配置,部分旧版本Sequelize的非标准配置会对超长字段名做自动截断处理 - 你可以在模型字段定义中显式指定
field属性强制绑定字段名,避免自动转换出问题,修改后的模型定义如下:minimum_reseller_markup: { type: DataTypes.INTEGER, defaultValue: 0, field: 'minimum_reseller_markup' // 显式指定数据库对应的字段名 },
- Sequelize 字段映射配置问题
- 查询语句配置了错误的别名
检查你执行查询的代码,是否在attributes参数中手动写了别名配置,类似下面的写法会把字段重命名为短的版本:
SupplierCatalog.findAll({ attributes: ['id', 'supplier_id', ['minimum_reseller_markup', 'minimum_reseller_mark']] // 这里手动写了别名导致返回字段名变化 })- 查询语句配置了错误的别名
- 模型被其他逻辑覆写
检查项目中是否有其他地方对SupplierCatalog模型的属性做了修改,比如全局的模型扩展逻辑、mixin注入、或者第三方插件修改了模型的字段定义。
- 模型被其他逻辑覆写
内容的提问来源于stack exchange,提问作者SAM
相关产品推荐
相关产品推荐

