Sequelize.js 为什么sequelize对外键列使用不同的名称?

Sequelize.js 为什么sequelize对外键列使用不同的名称?,sequelize.js,Sequelize.js,我遇到了一个问题,sequelize使用外键列的推断名称,而不是在模型中定义并在数据库中使用的列名 这发生在upsert和findAll 例如,给定以下模型: Parent.hasMany(Child, { as: 'parentChildren', foreignKey: { field: 'fkParentId', allowNull: false }, constraints: true, onDelete: 'CASCADE' }); 当我向上插入子项时

我遇到了一个问题,sequelize使用外键列的推断名称,而不是在模型中定义并在数据库中使用的列名

这发生在upsert和findAll

例如,给定以下模型:

Parent.hasMany(Child, {
    as: 'parentChildren',
    foreignKey: { field: 'fkParentId', allowNull: false },
    constraints: true,
    onDelete: 'CASCADE'
});
当我向上插入子项时,sequelize希望向上插入JSON为外键字段使用名称parentId

类似地,如果我只使用一个简单的where条件执行Child.findAll,JSON结果将使用字段的名称parentId。在我的数据库日志中,我可以看到sequelize将名称强制为parentId,例如:

SELECT field 1, field 2, etc, fkParentId AS parentId
我尝试通过添加Child.belongsTo来定义关系的双方,并且尝试使用sourceKey/targetKey,但这没有什么区别


有没有办法让sequelize接受并返回列的实际名称?

如果您查看文档中的关联,看起来您只是有一个字段不匹配。请参阅-如果将对象用作foreignKey,而不仅仅是字符串,那么在数据库中设置外键行名称的键实际上就是name键

试着用这个

Parent.hasMany(Child, {
  as: 'parentChildren',
  foreignKey: { name: 'fkParentId', allowNull: false },
  constraints: true,
  onDelete: 'CASCADE'
});
我对Sequelize 3.x.x有更多的经验,但这应该适用于4.x.x。如果这不起作用,那么我知道一个事实,如果在关联函数调用中使用foreignKey项的字符串,它将根据您的需要设置列的名称

如果是这种情况,那么您实际上可以在子模型的属性列表中手动创建列,并使用我上面提到的字符串foreignKey


祝你好运

您应该在此处使用otherKey

Parent.hasMany(Child, {
    as: 'parentChildren',
    foreignKey: { field: 'fkParentId', allowNull: false },
    otherKey: 'fkParentId'
    constraints: true,
    onDelete: 'CASCADE'
});