Ассоциации в 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"
    }
},
просто убедитесь, что модель, на которую вы ссылаетесь, существует.