Как автоматически генерировать миграцию с помощью Sequelize CLI из Sequelize моделей?
У меня есть набор Sequelize моделей. Я хочу использовать миграции, а не DB Sync.
Sequelize CLI, похоже, в состоянии сделать это, согласно этой статье:
"Когда вы используете CLI для генерации модели, вы также получите скрипты миграции".
Как автоматически генерировать миграции с помощью Sequelize CLI из существующих моделей Sequelize?
Ответы
Ответ 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 создаст для вас новый миграционный каталог