Упорядочить имена столбцов объединенной таблицы для ассоциации belongsToMany

#typescript #sequelize.js

#typescript #sequelize.js

Вопрос:

Я использую sequelize для своей базы данных postgres, и у меня есть следующие две таблицы:

  1. Исполнитель
  2. Альбом

Они предварительно определены с помощью sequelize.define

Это отношение M: N, поэтому я решил использовать следующие ассоциации:

Artist.belongsToMany(Albums, { through: 'ArtistAlbums' }

Album.belongsToMany(Artist, { through: 'ArtistAlbums' }

Это работает хорошо, однако таблица ArtistAlbums позже будет иметь очень странные названия столбцов:

«ArtistArtistId», «AlbumAlbumId», ссылающиеся на первичные ключи исполнителя (ArtistID) и альбома (albumId). Однако я хотел бы иметь там только «albumId» и «ArtistID», но не могу понять, как указать sequelize сделать именно это. Я попробовал следующее:

  1. Попытался указать модель в опции through, которая определяет два таких ключа.

Проблема: у меня были бы мои ключи, а также сгенерированные ключи в таблице

  1. Я попытался добавить к нему unique: false параметр, который также не сработал.
  2. Я пытался использовать «as» и «sourceKey», «targetKey», а также «uniqueKey», которые все не помогли.

Любая помощь приветствуется!

ПРАВКА 1:

Я думаю, что с помощью otherKey я смог присвоить одному из столбцов нужное мне имя, но не другому.

Ответ №1:

Попробуйте это:

 Artist.belongsToMany(Album, {
  through: 'ArtistAlbums',
  unique: false,
  foreignKey: 'artistId'
});

Album.belongsToMany(Artist, {
  through: 'ArtistAlbums',
  unique: false,
  foreignKey: 'albumId'
});
  

Обратите внимание, что единственное различие между моим кодом и вашим заключается в foreignKey определении.

Приведенный выше код создал следующий результат в моей базе данных PostgreSQL. (Я опустил некоторые данные):

 CREATE TABLE public."ArtistAlbums"
(
  "createdAt" timestamp with time zone NOT NULL,
  "updatedAt" timestamp with time zone NOT NULL,
  "artistId" integer NOT NULL,
  "albumId" integer NOT NULL,
  CONSTRAINT "ArtistAlbums_pkey" PRIMARY KEY ("artistId", "albumId"),
  CONSTRAINT "ArtistAlbums_albumId_fkey" FOREIGN KEY ("albumId")
      REFERENCES public."Album" (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT "ArtistAlbums_artistId_fkey" FOREIGN KEY ("artistId")
      REFERENCES public."Artist" (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE
)
  

Для создания других таблиц я использовал:

 const Artist = sequelize.define(
  'Artist',
  {
    id: {
      type: DataTypes.INTEGER,
      primaryKey: true
    }
  },
  {
    freezeTableName: true
  }
);

const Album = sequelize.define(
  'Album',
  {
    id: {
      type: DataTypes.INTEGER,
      primaryKey: true
    }
  },
  {
    freezeTableName: true
  }
);
  

Комментарии:

1. Привет, спасибо! Это сработало. За исключением того, что мне пришлось немного изменить структуру, учитывая, что в вашем ответе через unique amp; ForeignKey находятся на одном уровне. Я использую typescript, и параметры through: { model: 'ArtistsAlbum', unique: false }, foreignKey: 'artistId'