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 consequelize.define
o con clases que extiendan deModel
.
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
ymodels
se aconseja tenerlas dentro de otra carpeta llamadadb
.
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.
"migrations:generate"
→ se encarga de crear un archivo de boilerplate para hacer una migración nueva; el archivo se crea dentro de la carpeta que definimos en el archivo de configuración, en la propiedad "migrations-path"
más específicamente."migrations:run"
→ ejecuta todas las migraciones que están dentro de la carpeta especificada en el archivo de configuración; la carpeta que se indico en la propiedad "migrations-path"
."migrations:rollback"
→revierte la migración más reciente que se haya hecho.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
.
up
→ esta función se encarga de encapsular todo el código que llevará nuestra base de datos desde el estado actual hasta el nuevo estado deseado, mejor dicho, es la función en la que aplicamos los cambios a la db.down
→ por su parte, esta función es la encargada de revertir los cambios que hizo up
para traer la base de datos a un estado previo, si es que lo necesitáramos por algún motivo.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:
queryInterface
→ es un objeto que trae métodos que nos permiten modificar la base de datos (crear tablas, eliminar, etc.).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.