sequelize migrations generate example define create cli mysql node.js orm sequelize.js

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 propiedades unique


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)

  1. (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''); } };

  2. Haz un cambio en el modelo de Usuario.

  3. Eliminar tabla de la base de datos.
  4. Deshacer todas las migraciones: sequelize db:migrate:undo:all : sequelize db:migrate:undo:all
  5. 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