Ассоциации в Sequelize миграции
мое приложение в настоящее время использует Sequelize sync()
метод создания базы данных, и я хочу изменить его, чтобы использовать систему миграции.
одна из моих моделей имеет belongsTo()
ассоциации с другими моделями, и я действительно не знаю, как сделать исходный код миграции для этих ассоциаций.
мне нужно вручную создать внешний ключ с SQL-запросами или есть некоторые доступные методы?
4 ответов
Случай 1: инициализация базы данных
если ваша цель-добавить отношения во время инициализации структуры базы данных, лучше просто использовать sync
метод вместо ручного добавления их с помощью миграции. Если ваши модели хорошо продуманы и имеют определенные отношения, они будут созданы автоматически во время выполнения sync
метод.
посмотри sequelize экспресс пример. В каталоге models у вас есть три файла:
-
index.js
- который включает в себя все модели -
task.js
- модели задач -
user.js
- модели пользователей
посмотреть task.js
содержание, начиная с строки 7 следующий код создает связь между Пользователем и моделями задач:
classMethods: {
associate: function(models) {
Task.belongsTo(models.User, {
onDelete: "CASCADE",
foreignKey: {
allowNull: false
}
});
}
}
если вы правильно подготовите свои отношения в файлах модели, sync создаст внешние ключи для вас. В этом случае миграции не нужны.
I рекомендуем Вам прочитать весь экспресс-пример readme.md
и просматривать файлы репозитория, чтобы увидеть, как вещи работают с express и sequelize.
случай 2: миграция структуры базы данных
если у вас уже есть некоторые данные, которые вы хотите сохранить, вам нужно использовать сценарий миграции, потому что единственный способ для синхронизации реструктуризации базы данных-полностью уничтожить ее вместе со всеми ее данными.
вы можете прочитать о basic миграции в документах sequelize. К сожалению, документы не охватывают создание отношения. Предположим, вы хотите создать следующее отношение: пользователь принадлежит к группе. Чтобы создать столбец на стороне пользователя отношения, вы можете использовать addColumn
метод.
queryInterface.addColumn(
'user',
'group_id',
{
type: Sequelize.INTEGER,
allowNull: true
}
)
к сожалению, нет хорошей функции (пока) для создания ограничения внешнего ключа для вас, но вы можете сделать это вручную, используя метод sequelize query. Пример Postgresql:
queryInterface.sequelize.query("ALTER TABLE user
ADD CONSTRAINT user_group_id_fkey FOREIGN KEY (group_id)
REFERENCES group (id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE;");
изменить: Добавлен случай миграции структуры базы данных
после долгих поисков я нашел пару сообщений в блоге, объясняющих, что я хотел сделать.
по-видимому, это не очень распространенный способ сделать это, но мне кажется более логичным. Если вы хотите использовать только миграции, необходимо использовать SQL-запросы для создания начальной миграции.
добавление этого в качестве ответа вместо комментария (недостаточно rep) для ответа @aryeh-armon выше. Это имя таблицы, которое вам нужно убедиться, что существует, а не имя модели. т. е. если ваша модель называется Job, а ваша таблица db - Jobs, миграция будет выглядеть так.
jobId: {
type: Sequelize.INTEGER,
references: {
model: "Jobs",
key: "id"
}
},
вы можете добавить ссылки на миграции
Exmaple:
user_id: {
type: Sequelize.BIGINT,
references: {
model: "users",
key: "id"
}
},
просто убедитесь, что модель, на которую вы ссылаетесь, существует.