Ассоциации в Sequelize migrations

В настоящее время мое приложение использует метод Sequelize sync() для создания базы данных, и я хочу изменить его для использования системы миграции.

Одна из моих моделей имеет ассоциации belongsTo() с другими моделями, и я действительно не знаю, как сделать начальный код миграции для этих ассоциаций.

Нужно ли вручную создавать внешний ключ с SQL-запросами или есть ли какие-то методы?

Ответ 1

Случай 1: Инициализация базы данных

Если ваша цель заключается в добавлении отношений во время инициализации структуры базы данных, лучше просто использовать метод sync вместо того, чтобы вручную добавлять их с помощью миграции. Если ваши модели правильно спроектированы и определены отношения, они будут созданы автоматически во время выполнения метода sync.

Взгляните на пример сиквелизуйте пример. В каталоге моделей у вас есть три файла:

  • index.js - который включает все модели
  • task.js - модель задачи
  • user.js - модель пользователя

Посмотрите содержимое task.js, начиная с строки 7, следующий код создает связь между моделями User и Task:

classMethods: {
  associate: function(models) {
    Task.belongsTo(models.User, {
      onDelete: "CASCADE",
      foreignKey: {
        allowNull: false
      }
    });
  }
}

Если вы правильно подготовили свои отношения в файлах моделей, синхронизация создаст для вас внешние ключи. В этом случае миграции не нужны.

Я рекомендую вам прочитать весь экспресс-пример readme.md и просмотреть файлы репозитория, чтобы увидеть, как все работает с выражением и секьюритизацией.

Случай 2: миграция структуры базы данных

Если у вас уже есть некоторые данные, которые вы хотите сохранить, вам нужно использовать миграцию script, потому что единственный способ синхронизации вашей базы данных - полностью уничтожить ее вместе со всеми ее данными.

Вы можете прочитать об основных переходах в документах sequelize. К сожалению, документы не охватывают создание отношения. Предположим, вы хотите создать следующее отношение: Пользователь принадлежит группе. Чтобы создать столбец с пользовательской стороны отношения, вы можете использовать метод addColumn.

queryInterface.addColumn(
  'user',
  'group_id',
  {
    type: Sequelize.INTEGER,
    allowNull: true
  }
)

К сожалению, пока нет хорошей функции для создания ограничения внешнего ключа для вас, но вы можете сделать это вручную, используя метод secelize 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;");

Изменить: добавлен пример миграции структуры базы данных

Ответ 2

После многих поисков я нашел пару сообщений в блоге, объясняющих, что я хотел сделать.

По-видимому, это не обычный способ сделать это, но мне кажется более логичным. Если вы хотите использовать только миграцию, вам нужно использовать SQL-запросы для создания начальной миграции.

Вот сообщения: первый, вдохновленный этот.

Но в любом случае, я думаю, что ezrepotein прав насчет создания исходной базы данных с синхронизацией, а затем мигрировать. Это кажется проще, чем использование umzug и только использование миграции.

Ответ 3

вы можете добавить ссылки на миграции

Exmaple:

user_id: {
    type: Sequelize.BIGINT,
    references: {
        model: "users",
        key: "id"
    }
},

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

Ответ 4

Добавление этого в качестве ответа вместо комментария (недостаточно rep) для ответа @aryeh-armon выше. Это имя таблицы, которое нужно убедиться, существует, а не имя модели. т.е. если ваша модель называется Job, а ваша таблица db называется Jobs, тогда миграция будет выглядеть так же, как это.

jobId: {
type: Sequelize.INTEGER,
references: {
    model: "Jobs",
    key: "id"
  }
},