Подтвердить что ты не робот

Как автоматически генерировать миграцию с помощью Sequelize CLI из Sequelize моделей?

У меня есть набор Sequelize моделей. Я хочу использовать миграции, а не DB Sync.

Sequelize CLI, похоже, в состоянии сделать это, согласно этой статье: "Когда вы используете CLI для генерации модели, вы также получите скрипты миграции".

Как автоматически генерировать миграции с помощью Sequelize CLI из существующих моделей Sequelize?

4b9b3361

Ответ 1

Вы не можете создавать сценарии миграции для существующих моделей.

Ресурсы

Если вы идете классическим способом, вам придется воссоздать модели через CLI:

sequelize model:create --name MyUser --attributes first_name:string,last_name:string,bio:text

Он будет генерировать эти файлы:

Модели /myuser.js:

"use strict";
module.exports = function(sequelize, DataTypes) {
  var MyUser = sequelize.define("MyUser", {
    first_name: DataTypes.STRING,
    last_name: DataTypes.STRING,
    bio: DataTypes.TEXT
  }, {
    classMethods: {
      associate: function(models) {
        // associations can be defined here
      }
    }
  });
  return MyUser;
};

Ответ 2

Я создал небольшой рабочий "генератор файлов миграции". Он создает файлы, которые отлично работают с помощью sequelize db:migrate - даже с внешними ключами!

Вы можете найти его здесь: https://gist.github.com/manuelbieh/ae3b028286db10770c81

Я тестировал его в приложении с 12 различными моделями, охватывающими:

  • STRING, TEXT, ENUM, INTEGER, BOOLEAN, FLOAT как DataTypes

  • Ограничения внешнего ключа (даже взаимные (пользователь принадлежит команде, команде принадлежит пользователю как владельцу))

  • Индексы с name, method и unique свойствами

Ответ 3

Недавно я попробовал следующий подход, который, кажется, работает нормально, хотя я не уверен на 100%, если могут быть какие-либо побочные эффекты:

'use strict';

import * as models from "../../models";

module.exports = {

  up: function (queryInterface, Sequelize) {

    return queryInterface.createTable(models.Role.tableName, models.Role.attributes)
    .then(() => queryInterface.createTable(models.Team.tableName, models.Team.attributes))
    .then(() => queryInterface.createTable(models.User.tableName, models.User.attributes))

  },

  down: function (queryInterface, Sequelize) {
    ...
  }

};

При выполнении миграции выше, используя sequelize db:migrate, моя консоль говорит:

Starting 'db:migrate'...
Finished 'db:migrate' after 91 ms
== 20160113121833-create-tables: migrating =======
== 20160113121833-create-tables: migrated (0.518s)

Все таблицы есть, все (по крайней мере, похоже) работает должным образом. Даже все ассоциации существуют, если они определены правильно.

Ответ 4

Пока он не генерируется автоматически, одним из способов генерации новых миграций при изменении модели является: (предполагая, что вы используете структуру файла secelize-cli, где миграции и модели находятся на одном уровне)

  • (То же, что и предложение Мануэля Бие, но используя требование вместо импорта). В вашем файле миграции (если у вас его нет, вы можете сгенерировать его, выполнив "sequelize migration:create" ), следующие код:

    'use strict';
    var models = require("../models/index.js")
    module.exports = {
      up: function(queryInterface, Sequelize) {
        return queryInterface.createTable(models.User.tableName, 
          models.User.attributes);
      },
      down: function(queryInterface, Sequelize) {
        return queryInterface.dropTable('Users');
      }
    };
    
  • Внесите изменения в модель пользователя.

  • Удалить таблицу из базы данных.
  • Отменить все миграции: sequelize db:migrate:undo:all
  • Переименуйте изменения, сохраненные в db. sequelize db:migrate

Ответ 5

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

sequelize migration:generate --name [name_of_your_migration]

Это приведет к созданию файла миграции с пустыми скелетами. Хотя он не копирует вашу структуру модели в файл, мне становится проще и чище, чем регенерировать все. Примечание. Обязательно запустите команду из каталога, содержащего каталог ваших миграций. иначе CLI создаст для вас новый миграционный каталог