Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Configurando y corriendo migraciones con npm scripts

14/27
Recursos

Aportes 15

Preguntas 10

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Si de casualidad tienen el siguiente error al ejecutar npm run migrations:run

ERROR: Dialect needs to be explicitly supplied as of v4.0.0

tienen que definir su variable de entorno NODE_ENV en su archivo .env

NODE_ENV='development'

Parece ser que si se viene de haber usado MySQL del vídeo anterior, hay que hacer los cambios pertinentes para que todo quede de nuevo en PostgreSQL, de otro modo no hará la migración …

En el minuto 4:48, el profesor explica como usar la opción de down, pero hubo un pequeño error, se debe usar .dropTable( ) en vez de .drop( ) 😅

Aqui todos los comandos de la cli de sequlize (:

Sequelize-cli Commands:

  • sequelize-cli db:migrate Run pending migrations
  • sequelize-cli db:migrate:schema:timestamps:add Update migration table to have timestamps
  • sequelize-cli db:migrate:status List the status of all migrations
  • sequelize-cli db:migrate:undo Reverts a migration
  • sequelize-cli db:migrate:undo:all Revert all migrations ran
  • sequelize-cli db:seed Run specified seeder
  • sequelize-cli db:seed:undo Deletes data from the database
  • sequelize-cli db:seed:all Run every seeder
  • sequelize-cli db:seed:undo:all Deletes data from the database
  • sequelize-cli db:create Create database specified by configuration
  • sequelize-cli db:drop Drop database specified by configuration
  • sequelize-cli init Initializes project
  • sequelize-cli init:config Initializes configuration
  • sequelize-cli init:migrations Initializes migrations
  • sequelize-cli init:models Initializes models
  • sequelize-cli init:seeders Initializes seeders
  • sequelize-cli migration:generate Generates a new migration file
  • [aliases: migration:create]
    sequelize-cli model:generate Generates a model and its migration
  • [aliases: model:create]
    sequelize-cli seed:generate Generates a new seed file

Segun veo el profe revirtio los cambios que habiamos hecho por cambiar de motor, recuerda poner las keys de mysql a postgres y el puerto en el archivo env

  DB_PORT='5432'

Recomendaciones

✨ Recomiendo que tengan un archivo migration.template.js:

// schemas imports

module.exports = {
    up: async (queryInterface) => {
        // code
    },

    down: async (queryInterface) => {
        // code
    },
};

por si a alguno no le ha corrido y salido este mensaje aqui les expongo lo que me sucedió:

> [email protected]1.0.0 migrations:generate /home/emercado/backendDev/my-backend-pg
> sequelize-cli migration:generate --name "create-user"

/home/emercado/backendDev/my-backend-pg/.sequelizerc:3
  'models-path': './db/models'
  ^^^^^^^^^^^^^

SyntaxError: Unexpected string
    at wrapSafe (internal/modules/cjs/loader.js:1001:16)
    at Module._compile (internal/modules/cjs/loader.js:1049:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
    at Module.load (internal/modules/cjs/loader.js:950:32)
    at Function.Module._load (internal/modules/cjs/loader.js:790:12)
    at Module.require (internal/modules/cjs/loader.js:974:19)
    at require (internal/modules/cjs/helpers.js:93:18)
    at loadRCFile (/home/emercado/backendDev/my-backend-pg/node_modules/sequelize-cli/lib/core/yargs.js:23:77)
    at Object.<anonymous> (/home/emercado/backendDev/my-backend-pg/node_modules/sequelize-cli/lib/core/yargs.js:26:63)
    at Module._compile (internal/modules/cjs/loader.js:1085:14)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected]1.0.0 migrations:generate: `sequelize-cli migration:generate --name "create-user"`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected]1.0.0 migrations:generate script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/emercado/.npm/_logs/2021-11-25T08_35_03_626Z-debug.log
[email protected]:~/backendDev/my-backend-pg$ code /home/emercado/.npm/_logs/

en el archivo .sequelizerc me faltaban unas comas corregi y corrio normal:

> [email protected]1.0.0 migrations:generate /home/emercado/backendDev/my-backend-pg
> sequelize-cli migration:generate --name "create-user"


Sequelize CLI [Node: 14.18.0, CLI: 6.3.0, ORM: 6.12.0-alpha.1]

migrations folder at "/home/emercado/backendDev/my-backend-pg/db/migrations" already exists.
New migration was created at /home/emercado/backendDev/my-backend-pg/db/migrations/20211125084917-create-user.js .

**** el archivo mencionado:

module.exports = {
  'config': './db/config.js',
  'models-path': './db/models',
  'migrations-path': './db/migrations',
  'seeders-path': './db/seeders',
}

Sequelize no crea las migraciones de forma automática como otros ORM en base a los cambios que se tengan en el modelo. Tenemos el motor para hacer migraciones y nosotros decimos el cómo debemos hacer las migraciones.

El script "migrations:generate": "sequelize-cli migration:generate --name" va a generar el boilerplate de una migración.

Por ejemplo, en la terminal se ejecuta npm run migrations:generate create-user para crear una migración para los usuarios.

Esto va a crear un archivo (boilerplate) que es una pieza de código lista para empezar a correr migraciones, pero manualmente se debe poner cómo hacer y qué correr.

Ejemplo del boilerplate para migrar usuario 20220109030523-create-user.js:

'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => {
    /**
     * Add altering commands here.
     *
     * Example:
     * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
     */
  },

  down: async (queryInterface, Sequelize) => {
    /**
     * Add reverting commands here.
     *
     * Example:
     * await queryInterface.dropTable('users');
     */
  }
};

Se requiere el esquema y el nombre de la tabla.

Para revertir cambios se escribe código en down. Es decir, se revierte lo que se puso en up.

En caso de que se tengan varios modelos, se pueden integrar en el mismo archivo.

'use strict';

const { UserSchema, USER_TABLE } = require('../models/user.model');

module.exports = {
  up: async (queryInterface) => {
    await queryInterface.createTable(USER_TABLE, UserSchema);
  },

  down: async (queryInterface) => {
    await queryInterface.drop(USER_TABLE);
  },
};

Para correr las migraciones se añade un script con el comando "migrations:run": "sequelize-cli db:migrate". De esa manera detecta todas las migraciones de la carpeta migrations y las empieza a correr.

También, se puede hacer un rollback añadiendo el script "migrations:revert": "sequelize-cli db:migrate:undo", y de esa manera revertimos a la última migración.

Otro script (peligroso) que se puede añadir es "migrations:delete": "sequelize-cli db:migrate:undo:all", esto va a vaciar todas las migraciones, es decir, va a revertir todas las migraciones que se hayan corrido como para empezar de cero. Hay que tener cuidado en producción ya que ese comando borraría todo, incluyendo la información.

Al ejecutar "migrations:run" se crean las tablas del modelo y además la tabla SequelizeMeta que guarda el histórico de las migraciones que se han ejecutado.

ahora me sale este error

“migrations:generate”: “sequelize-cli migration:generate --name”

Compañeros, espero estén muy bien, me topé con el caso de que la configuración que tenemos en el archivo config.js no me funciona, ya que al ejecutar la migración me aparecía un error de este tipo:

sequelize-cli db:migrate

Sequelize CLI [Node: 14.17.5, CLI: 6.4.0, ORM: 6.13.0]

ERROR: Error reading "config\config.js". Error: Error [ERR_UNSUPPORTED_ESM_URL_SCHEME]: Only file and data URLs are supported by the default ESM loader. On Windows, absolute paths must be valid file:// URLs. Received protocol 'd:'

Luego de un rato de consultar y probar, me funcionó cambiar el archivo config.js por config.json, en donde se especifica lo siguiente:

{
  "development": {
    "username": "admin",
    "password": "root",
    "database": "posstgres",
    "host": "localhost",
    "port": "5437",
    "dialect": "postgres"
  },
  "production": {
    "username": "admin",
    "password": "root",
    "database": "posstgres",
    "host": "localhost",
    "port": "5437",
    "dialect": "postgres"
  }
}

Resultado:

sequelize-cli db:migrate

Sequelize CLI [Node: 14.17.5, CLI: 6.4.0, ORM: 6.13.0]

Loaded configuration file "db\config.json".
Using environment "development".
== 20220115015915-create-user: migrating =======
== 20220115015915-create-user: migrated (0.222s)

Si alguien sabe el por qué de esta situación, le agradezco explicarnos.

que elegante esta clase, lo mejor del curso

what a nasty class 🖖

no sé pero este curso se me ha hecho algo incómodo, a cada rato es un error cosa que es bueno porque nos hace aprendder de ellos, pero por ejemplo aqui me quedé con un error que no se como resolver :

Me recuerda muchos como se hacen las migraciones en Ruby on Rails