Ассоциации в 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"
    }
},

просто убедитесь, что модель, на которую вы ссылаетесь, существует.