【问题标题】:Sequelize Many to Many Include fails with column does not existSequelize Many to Many Include 失败,列不存在
【发布时间】:2020-07-01 23:55:32
【问题描述】:

我有 2 个表通过第三个表使用 belongsToMany 关联。我想从 user 表中查询特定用户,其中包含与 user_id 匹配的关联播放列表数组(来自 playlists 表)。

预期的查询返回

{
    user_id: 'id',
    ...
    user_playlists: [{
        playlist_id: 'id',
        playlist_title: 'title',
        playlist_songs:[...],
        ...
    },{...}]
}

我实际上是在 sequelize-typescript 中执行此操作,但这里是用于设置的 postgresql 命令。

播放列表

CREATE TABLE IF NOT EXISTS "playlists" ("playlist_id" VARCHAR(255) , "playlist_title" VARCHAR(255), "playlist_description" VARCHAR(255), "playlist_image" VARCHAR(255), "playlist_songs" INTEGER[], "playlist_createdAt" TIMESTAMP WITH TIME ZONE, "playlist_updatedAt" TIMESTAMP WITH TIME ZONE, PRIMARY KEY ("playlist_id"));

用户

CREATE TABLE IF NOT EXISTS "users" ("user_id" VARCHAR(255) , "user_firstName" VARCHAR(255), "user_lastName" VARCHAR(255), "user_email" VARCHAR(255), "user_password" VARCHAR(255), "user_favourites" INTEGER[], "user_following" INTEGER[], "user_recentlyPlayed" INTEGER[], "user_createdAt" TIMESTAMP WITH TIME ZONE, "user_updatedAt" TIMESTAMP WITH TIME ZONE, PRIMARY KEY ("user_id"));

用户播放列表

CREATE TABLE IF NOT EXISTS "user_playlist" ("user_id" VARCHAR(255)  REFERENCES "users" ("user_id") ON DELETE CASCADE ON UPDATE CASCADE, "playlist_id" VARCHAR(255)  REFERENCES "playlists" ("playlist_id") ON DELETE CASCADE ON UPDATE CASCADE, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL, UNIQUE ("user_id", "playlist_id"), PRIMARY KEY ("user_id","playlist_id"));

序列化查询命令

      const result = await User.findByPk(id, {
        raw: false,
        include: [
          {
            model: Playlist,
            where: {user_id: id},
            as: 'user_playlists',
            required: false,
            attributes: ['playlist_id', 'playlist_title'],
          },
        ],
      });

以及生成的postgresql查询

SELECT "User"."user_id", "User"."user_firstName", "User"."user_lastName", "User"."user_email", "User"."user_password", "User"."user_favourites", "User"."user_following", "User"."user_recentlyPlayed", "User"."user_createdAt", "User"."user_updatedAt", "user_playlists"."playlist_id" AS "user_playlists.playlist_id", "user_playlists"."playlist_title" AS "user_playlists.playlist_title", "user_playlists->UserPlaylist"."user_id" AS "user_playlists.UserPlaylist.user_id", "user_playlists->UserPlaylist"."playlist_id" AS "user_playlists.UserPlaylist.playlist_id", "user_playlists->UserPlaylist"."createdAt" AS "user_playlists.UserPlaylist.createdAt", "user_playlists->UserPlaylist"."updatedAt" AS "user_playlists.UserPlaylist.updatedAt" 
FROM "users" AS "User" 
LEFT OUTER JOIN ( "user_playlist" AS "user_playlists->UserPlaylist" 
INNER JOIN "playlists" AS "user_playlists" 
ON "user_playlists"."playlist_id" = "user_playlists->UserPlaylist"."playlist_id") 
ON "User"."user_id" = "user_playlists->UserPlaylist"."user_id" 
AND "user_playlists"."user_id" = 'H2qAdR0c81c3xGFk5PmgDXKAjis1' 
WHERE "User"."user_id" = 'H2qAdR0c81c3xGFk5PmgDXKAjis1';

这是我收到的错误:

postgresql    | 2020-03-20 15:57:05.976 UTC [58] ERROR:  column user_playlists.user_id does not exist at character 1015

我可以确认 user_playlist 表有 user_id 列:

SELECT * FROM user_playlist;
           user_id            |             playlist_id              |         createdAt          |         updatedAt          
------------------------------+--------------------------------------+----------------------------+----------------------------
 H2qAdR0c81c3xGFk5PmgDXKAjis1 | 9cf2e2ed-932b-4e98-bb6a-39c1e324dc09 | 2020-03-20 16:30:08.387+00 | 2020-03-20 16:30:08.387+00

感觉查询错了,在最后一个AND之后

如果我手动对 postgresql 查询进行以下更改:

发件人:

AND "user_playlists"."user_id" = 'H2qAdR0c81c3xGFk5PmgDXKAjis1' WHERE "User"."user_id" = 'H2qAdR0c81c3xGFk5PmgDXKAjis1';

收件人:

 AND "user_playlists->UserPlaylist"."user_id" = 'H2qAdR0c81c3xGFk5PmgDXKAjis1' WHERE "User"."user_id" = 'H2qAdR0c81c3xGFk5PmgDXKAjis1';

然后查询有效,但我怎样才能让 sequelize 做到这一点?

也许我在设置中做错了什么?

顺便说一句,我正在“续集”:“5.21.5”和 postgres:11.6-alpine

【问题讨论】:

  • 删除“where: {user_id: id}”和“required: false”
  • 就是这样,谢谢!如果你回答我会批准它。

标签: postgresql sequelize.js sequelize-typescript


【解决方案1】:

删除“where: {user_id: id}”和“required: false”

【讨论】:

    猜你喜欢
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 2022-12-28
    相关资源
    最近更新 更多