我尝试使用 Sequelize 进行 MySQL 查询,在我的代码中我定义了我的模型并将它们与各自的关联链接起来。
尝试模拟具有以下内容的音乐播放列表: 艺术家,他们可以有多首歌曲。
播放列表,也有多首歌曲。
歌曲,属于 1 个或多个播放列表的一部分,并且有 1 个或多个艺术家。
模型的定义如下:
在每个模型中,我都定义了一个带有各自字段的接口,以确保类型安全和舒适度
艺术家
export interface IArtist {
ID_ARTIST: number,
NAME: string
}
export const Artist = seq.define<Model<IArtist>>("Artist", {
ID_ARTIST: {
primaryKey: true,
type: DataTypes.INTEGER,
allowNull: false,
autoIncrement: true
},
NAME: DataTypes.STRING(30)
}, {
timestamps: true,
createdAt: true,
updatedAt: false,
tableName: "ARTISTS",
})
播放列表
export interface IPlaylist {
ID_PLAYLIST: number,
NAME: string
}
export const PlayList = seq.define<Model<IPlaylist>>("Playlist", {
ID_PLAYLIST: {
primaryKey: true,
type: DataTypes.INTEGER,
allowNull: false,
autoIncrement: true,
},
NAME: DataTypes.STRING(20)
}, {
timestamps: true,
createdAt: true,
updatedAt: false,
tableName: "PLAYLISTS"
})
歌曲
export interface ISong {
ID_SONG: number,
ID_ARTIST: number,
ID_PLAYLIST: number,
DURATION: number,
NAME: string
}
export const Song = seq.define<Model<ISong>>("Song", {
ID_SONG: {
primaryKey: true,
type: DataTypes.INTEGER,
allowNull: false,
autoIncrement: true
},
ID_ARTIST: {
type: DataTypes.INTEGER,
references: {
model: Artist,
key: "ID_ARTIST"
}
},
ID_PLAYLIST: {
type: DataTypes.INTEGER,
references: {
model: PlayList,
key: "ID_PLAYLIST"
}
},
DURATION: DataTypes.INTEGER,
NAME: DataTypes.STRING(40)
}, {
timestamps: true,
updatedAt: false,
tableName: "SONGS"
})
以及各表的关系:
Artist.hasMany(Song)
PlayList.hasMany(Song)
Song.belongsTo(Artist, { foreignKey: "ID_ARTIST" })
Song.belongsTo(PlayList, { foreignKey: "ID_PLAYLIST" })
然后当我尝试执行这样的“findAll”操作时:
const query = await Song.findAll({
include: {
model: Artist,
required: true
},
where: {
ID_ARTIST: idArtist
}
})
idArtist 是一个函数参数 -> idArtist: string
我收到下一个错误: sqlMessage:“‘字段列表’中存在未知列‘Song.ArtistIDARTIST’”
sequelize 的查询结果: sql: "选择
Song
.ID_SONG
, Song
.ID_ARTIST
, Song
.ID_PLAYLIST
, Song
.DURATION
, Song
.NAME
, Song
. createdAt
,Song
。ArtistIDARTIST
,Song
。PlaylistIDPLAYLIST
,Artist
。ID_ARTIST
AS Artist.ID_ARTIST
,Artist
。NAME
AS Artist.NAME
,Artist
。 createdAt
AS Artist.createdAt
FROM SONGS
AS Song
内连接 ARTISTS
AS Artist
ON Song
.ID_ARTIST
= Artist
.ID_ARTIST
哪里 Song
.ID_ARTIST
= '1';"
为什么在 findAll 或类似方法中不使用“属性”字段时,sequelize 会尝试获取不存在的列,例如 Song.PlaylistIDPLAYLIST 或 Song.ArtistIDARTIST
提前致谢,如果需要其他信息请告诉我:)