Sequelize nos permite hacer migraciones a través de su CLI, de esta forma podemos tener un registro de todos los cambios que se han aplicado en la base de datos. Para empezar debemos tener en cuenta que sequelize.sync() no es seguro para producción y es exactamente ese problema el que las migraciones nos ayudan a resolver, estas nos proveen un mecanismo para llevar nuestra base de datos de un estado a otro de una forma segura que podemos utilizar en ambiente productivos en donde usamos información de personas reales.

Aunque ya no usamos sequelize.sync(), si tenemos que seguir definiendo nuestros modelos, ya sea con **sequelize.define** o con clases que extiendan de Model.

Lo primero que podemos hacer es descargar el CLI de Sequelize; se puede usar cualquier gestor de paquetes para node.

**npm i sequelize-cli -D
yarn add sequelize-cli -D**

Luego, en la raíz del proyecto debemos crear un archivo llamado .sequelizrc que se encarga de proveer la configuración necesaria para el CLI de sequelize.

**module.exports = {
	"config": "path/to/config.js",
  "models-path": "path/to/models/",
  "migrations-path": "path/to/migrations/",
  "seeders-path": "path/to/seeders/"	
}**

Las carpetas de migrations, seeders y **models** se aconseja tenerlas dentro de otra carpeta llamada db.

Ahora, en el archivo config.js vamos a configurar la conexión con la base de datos para ambientes de desarrollo y producción, veamos la configuración más simple:

**const config = {
  "url": "your URI string connection",
  "dialect": "your db name"
};

module.exports = {
  "development": config,
  "production": config
};**

Después, podemos crear algunos scripts dentro de nuestro package.json para facilitar el trabajo.

**"scripts": {
	"migrations:generate": "sequelize-cli migration:generate --name",
  "migrations:run": "sequelize-cli db:migrate",
  "migrations:rollback": "sequelize-cli db:migrate:undo"
}**

Con esto tenemos un script que podemos utilizar para todos los casos de uso que podamos tener dentro de nuestras migraciones.

Ya casi para terminar, podemos ir a nuestra terminal y ejecutar:

npm run migrations:generate --name yourMigrationName

Y después de que el comando se ejecute podremos ver que hay un archivo nuevo dentro de nuestra carpeta de migrations. Este archivo trae cierto código por defecto, lo primero que podemos ver es que exporta un objeto con dos funciones, up y down.

Por ejemplo, si en up decidimos crear una tabla que se llama users, entonces en down debemos asegurarnos de borrar esa tabla para que así, si es que hacemos un rollback entonces podamos volver al estado en el que estaba la db originalmente.

Además, en el código generado por Sequelize, podemos ver que las funciones up y down vienen con dos parámetros:

  1. queryInterface → es un objeto que trae métodos que nos permiten modificar la base de datos (crear tablas, eliminar, etc.).
  2. Sequelize → es un objeto que contiene los dataTypes de Sequelize, si es que los necesitamos para alguna operación.

Finalmente, ya podemos correr nuestra migración con el comando

npm run migrations

Y Sequelize se encargará de aplicar todos los cambios en la base de datos de forma segura.

Si vas a tu base de datos, encontrarás una tabla llamada SequelizeMeta, es aquí donde Sequelize guarda todos los registros de las migraciones que se han hecho.

Cabe aclarar que después de que una migración haya sido ejecutada, Sequelize no la volverá a ejecutar porque sabe que los cambios ya han sido aplicados y no es necesario volver a hacerlo.