Sequelize:原始:错误:当包含没有“属性”字段的模型时,“字段列表”中存在未知列“”

问题描述 投票:0回答:1

我尝试使用 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

提前致谢,如果需要其他信息请告诉我:)

javascript sql mysql typescript sequelize.js
1个回答
0
投票

您只需要使用相同的

foreignKey
选项定义配对关联,请参阅我的答案

© www.soinside.com 2019 - 2024. All rights reserved.