mysql - migrations - ¿Cómo generar automáticamente migraciones con Sequelize CLI desde los modelos de Sequelize?
sequelize types (6)
Ahora puede usar el paquete npm sequelize-auto-migrations para generar automáticamente un archivo de migraciones. https://www.npmjs.com/package/sequelize-auto-migrations
Usando sequelize-cli, inicialice su proyecto con
sequelize init
Crea tus modelos y ponlos en tu carpeta de modelos.
Instalar secuela-auto-migraciones:
npm install sequelize-auto-migrations
Crea un archivo de migración inicial con
node ./node_modules/sequelize-auto-migrations/bin/makemigration --name <initial_migration_name>
Ejecute su migración:
node ./node_modules/sequelize-auto-migrations/bin/runmigration
También puede generar automáticamente sus modelos a partir de una base de datos existente, pero eso está más allá del alcance de la pregunta.
Tengo un conjunto de modelos Sequelize. Quiero usar migraciones, no DB Sync.
La CLI secuela parece ser capaz de hacer esto, de acuerdo con este artículo : "Cuando utiliza la CLI para la generación de modelos, también obtendrá los scripts de migración de forma gratuita".
¿Cómo generar automáticamente las migraciones con Sequelize CLI desde los modelos existentes de Sequelize?
Creé un pequeño "generador de archivos de migración" que funcionaba. Crea archivos que funcionan perfectamente bien usando sequelize db:migrate
, ¡incluso con claves externas!
Puede encontrarlo aquí: https://gist.github.com/manuelbieh/ae3b028286db10770c81
Lo probé en una aplicación con 12 modelos diferentes que abarca:
STRING, TEXT, ENUM, INTEGER, BOOLEAN, FLOAT como DataTypes
Restricciones de clave externa (incluso recíprocas (el usuario pertenece al equipo, el equipo pertenece al usuario como el propietario))
Índices con
name
,method
y propiedadesunique
No puede crear scripts de migración para modelos existentes.
Recursos:
Si va de la manera clásica, tendrá que volver a crear los modelos a través de la CLI:
sequelize model:create --name MyUser --attributes first_name:string,last_name:string,bio:text
Generará estos archivos:
models / 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;
};
migrations / 20150210104840-create-my-user.js:
"use strict";
module.exports = {
up: function(migration, DataTypes, done) {
migration.createTable("MyUsers", {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: DataTypes.INTEGER
},
first_name: {
type: DataTypes.STRING
},
last_name: {
type: DataTypes.STRING
},
bio: {
type: DataTypes.TEXT
},
createdAt: {
allowNull: false,
type: DataTypes.DATE
},
updatedAt: {
allowNull: false,
type: DataTypes.DATE
}
}).done(done);
},
down: function(migration, DataTypes, done) {
migration.dropTable("MyUsers").done(done);
}
};
Recientemente probé el siguiente enfoque, que parece funcionar bien, aunque no estoy 100% seguro de que pueda haber algún efecto secundario:
''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) {
...
}
};
Cuando sequelize db:migrate
la migración anterior utilizando sequelize db:migrate
, mi consola dice:
Starting ''db:migrate''...
Finished ''db:migrate'' after 91 ms
== 20160113121833-create-tables: migrating =======
== 20160113121833-create-tables: migrated (0.518s)
Todas las tablas están ahí, todo (al menos parece) funciona como se esperaba. Incluso todas las asociaciones están ahí si están definidas correctamente.
Si bien no se genera automáticamente, una forma de generar nuevas migraciones en un cambio a un modelo es: (suponiendo que está utilizando la estructura de archivo stock sequelize-cli donde las migraciones y los modelos están en el mismo nivel)
(Igual que la sugerencia de Manuel Bieh, pero usando un requerimiento en lugar de una importación) En su archivo de migración (si no tiene uno, puede generar uno haciendo "
sequelize migration:create
") tenga el siguiente código:''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''); } };
Haz un cambio en el modelo de Usuario.
- Eliminar tabla de la base de datos.
- Deshacer todas las migraciones:
sequelize db:migrate:undo:all
:sequelize db:migrate:undo:all
- Vuelva a migrar para guardar los cambios guardados en db.
sequelize db:migrate
Si no desea volver a crear su modelo desde cero, puede generar manualmente un archivo de migración utilizando el siguiente comando CLI:
sequelize migration:generate --name [name_of_your_migration]
Esto generará un archivo de migración de esqueleto en blanco. Si bien no copia la estructura de su modelo en el archivo, lo encuentro más fácil y más limpio que regenerar todo. Nota: asegúrese de ejecutar el comando desde el directorio contenedor de su directorio de migraciones; de lo contrario, la CLI generará un nuevo directorio de migración para usted