#typescript #sequelize.js
#typescript #sequelize.js
Вопрос:
Я использую sequelize для своей базы данных postgres, и у меня есть следующие две таблицы:
- Исполнитель
- Альбом
Они предварительно определены с помощью sequelize.define
Это отношение M: N, поэтому я решил использовать следующие ассоциации:
Artist.belongsToMany(Albums, { through: 'ArtistAlbums' }
Album.belongsToMany(Artist, { through: 'ArtistAlbums' }
Это работает хорошо, однако таблица ArtistAlbums позже будет иметь очень странные названия столбцов:
«ArtistArtistId», «AlbumAlbumId», ссылающиеся на первичные ключи исполнителя (ArtistID) и альбома (albumId). Однако я хотел бы иметь там только «albumId» и «ArtistID», но не могу понять, как указать sequelize сделать именно это. Я попробовал следующее:
- Попытался указать модель в опции through, которая определяет два таких ключа.
Проблема: у меня были бы мои ключи, а также сгенерированные ключи в таблице
- Я попытался добавить к нему
unique: false
параметр, который также не сработал. - Я пытался использовать «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'