为什么我的外键列在用Sequelize和Postgres发送POST请求后返回了两次



我有一个唱片(=专辑(模型和一个艺术家模型,我正试图通过Postman将一张艺术家的唱片发布到此URL:http://localhost:3000/api/artists/:artistId/records。Postgres返回错误errorMissingColumnPerhaps you meant to reference the column "VBRecords.artistId".(VBRecords是我所称的表,以避免内部关键字可能带来的复杂性。(

我的服务器记录以下查询,该查询在上述POST请求中执行:

Executing (default): INSERT INTO "VBRecords" ("id","title","createdAt","updatedAt","artistId") VALUES (DEFAULT,$1,$2,$3,$4) RETURNING "id","title","createdAt","updatedAt","ArtistId","artistId";

我相信ArtistId(RETURNING块中倒数第二个参数(是导致问题的原因,但我不知道它是从哪里来的。就我对文档的理解而言,它不应该存在,因为最后一个参数artistId是正确的,因为它来自params。

这些是我的模型。我是Sequelize的新手,也许模型定义有问题。

models/artist.js

const { Model } = require('sequelize')
module.exports = (sequelize, DataTypes) => {
class Artist extends Model {
static associate(models) {
// removing this association (see UPDATE at the bottom of this post)
// Artist.hasMany(models.Record, { as: 'records' })
}
}
Artist.init({
name: {
type: DataTypes.STRING,
allowNull: false
}
}, {
modelName: 'Artist',
sequelize,
tableName: 'VBArtists'
})
return Artist
}

型号/record.js

const { Model } = require('sequelize')
module.exports = (sequelize, DataTypes) => {
class Record extends Model {
static associate(models) {
Record.belongsTo(models.Artist, {
foreignKey: 'artistId',
onDelete: 'CASCADE'
})
}
}
Record.init({
title: {
type: DataTypes.STRING,
allowNull: false
}
}, {
modelName: 'Record',
sequelize,
tableName: 'VBRecords'
})
return Record
}

感谢您的帮助,如果我能添加更多代码,请告诉我哪些文件。

提前感谢!

更新:

从艺术家模型中删除hasMany关联后,它就工作了。但我不明白为什么,就像sequelize文档所说的那样,将这两个关联添加到一对多关系中:

实现

主要方法如下:

Team.hasMany(球员(;Player.belongsTo(团队(;

我通过使用模型内部的关联来修复它:

艺术家.js

const { Model} = require('sequelize')
module.exports = (sequelize, DataTypes) => {
class Artist extends Model {
static associate(models) {
Artist.hasMany(models.Record, {
foreignKey: 'artistId',
onDelete: 'CASCADE'
})
}
}
...
}

record.js

const { Model } = require('sequelize')
module.exports = (sequelize, DataTypes) => {
class Record extends Model {
static associate(models) {
Record.belongsTo(models.Artist, {
foreignKey: 'artistId'
})
}
}
...
}

我想诀窍是将外键属性添加到两个关联中。希望这对将来的某个人有所帮助。

之所以会发生这种情况,是因为sequelize by defautl将外键定义/识别为modelId。如果要以任何不同的方式命名外键(如ModelId(,那么在定义关系时,肯定需要使用foreignKey属性来指定。如果没有,sequelize会将FK视为另一个公共字段,并尝试按照其自己的名称格式定位FK,这就是为什么它看起来像是返回了两次。

希望这也能帮助到别人!

最新更新