为什么Sequelize将'media'转为'medium'导致关联查询medium_id不存在报错
问题原因
- 该报错由Sequelize内置的英文名词单复数自动转换逻辑导致,和你配置的
freezeTableName、tableName参数无关,这两个参数仅控制表名生成规则,不影响外键名的自动推断规则:- Sequelize依赖的词形转换库默认将
Media识别为复数形式,对应的单数形式为Medium - 你未在多对多关联配置中显式指定外键名时,Sequelize会自动用模型名的单数形式拼接
_id生成外键名,因此生成了不存在的medium_id字段
- Sequelize依赖的词形转换库默认将
解决方案
方案1:显式指定关联外键(推荐)
在定义Properties和Media的多对多关联配置中,明确指定中间表对应的外键字段即可:
// Properties 与 Media 多对多关联配置示例 Properties.belongsToMany(Media, { through: PropertyMedia, foreignKey: 'propertyId', // 中间表指向 Properties 模型的外键 otherKey: 'mediaId' // 中间表指向 Media 模型的外键 }) Media.belongsToMany(Properties, { through: PropertyMedia, foreignKey: 'mediaId', otherKey: 'propertyId' })
方案2:显式指定Media模型的单复数名称
如果你不想每次关联时额外指定外键,也可以在定义Media模型时,显式声明单复数名称,禁用Sequelize的自动词形转换:
let Media = sequelize.define('Media', { url: DataTypes.STRING, isVideo: DataTypes.BOOLEAN }, { freezeTableName: true, tableName: 'media', // 新增单复数配置 name: { singular: 'Media', plural: 'Media' } });
内容的提问来源于stack exchange,提问作者Cameron Hanton
相关产品推荐
相关产品推荐

