Migraciones con Knex.js

Migraciones con Knex.js

Una migración es la parte más importante en una herramienta de desarrollo. Es la sincronización de tu código con la base de datos. Es un concepto tan popular que la mayoría de herramientas las tiene.


Instalacion y configuración

Instala knex en el sistema de manera global.

$ npm install -g knex

Creamos un archivo knexfile.js con el comando init.

$ knex init
Created ./knexfile.js

Crea una base de datos y déjala vacía. Para éste ejemplo usaré el motor de base de datos MariaDB. La configuración debería de ser casi la misma. Recuerda cambiarla por la tuya. Tu usuario, contraseña y nombre de la base de datos.

Como no voy a trabajar en entorno de production, lo haré sobre development.

module.exports = {
    development: {
      client: 'mysql',
      connection: {
        host : '127.0.0.1',
        user : 'root',
        password : 'mipass',
        database : 'blogalexandermiss'
      },
      useNullAsDefault: true
    }
};

El useNullAsDefault es para decirle al motor que hará con los campos a los que no se le asigne ningun valor. Al decirle que en su lugar no sea default, se le pone null.


Nuestra primera migración

En la terminal escribimos lo siguiente. Esto es para generar nuestro primer archivo de migración.

$ knex migrate:make 001_inicial
Using environment: development
Created Migration: C:\Users\PERSONAL\Documents\nodes\bsh\migrations\20190320215157_001_initial.js

No hay ciencia. Por lo que ven, le puse un nombre que identifique un número consecutivo seguido del nombre que quiero nombrar la migración, algo que lo identifique.


Analizando el archivo

Si abres el archivo 20190320215157_001_initial.js verás lo siguiente:

exports.up

Es lo que la migración creará según lo que configuremos. Podremos configurar desde la creación de nuevas tablas, nuevos campos, cambiar tipos de campos, etc.

exports.down

Es lo que podríamos deshacer en la migración actual. Diríamos que es lo inverso de lo que configuremos en exports.up. Es decir, si quisiéramos regresar a una versión anterior de la migración y deshacer la creación de una tabla, un campo o lo que le indicamos lo podríamos hacer con esa acción.

exports.up = function(knex, Promise) {
  return knex.schema.hasTable('users').then(function(exists) {
	  if (!exists) {
		return knex.schema.createTable('users', function(t) {
		  t.increments('id').primary();
		  t.string('first_name', 100);
		  t.string('last_name', 100);
		  t.text('bio');
		});
	  }
	});
};

exports.down = function(knex, Promise) {
  return knex.schema.hasTable('users').then(function(exists) {
	  if (exists) {
		return knex.schema.dropTable('users');
	  }
	});
};

A diferencia de las migraciones como Django o Rails, aquí tenemos que hacer todo manualmente, puesto que knex no detecta los cambios en modelos.


Aplicando migraciones

Ahí la migración esta lista para crear la tabla llamada users. Así que tenemos que correr la migración para que los cambios se reflejen en la base de datos.

$ knex migrate:latest
Using environment: development
Batch 1 run: 1 migrations
C:\Users\PERSONAL\Documents\nodes\bsh\migrations\20190320215157_001_initial.js

El comando migrate:latest corre las últimas migraciones que aún no han sido aplicadas a la base de datos.

Después de correr el comando, el aspecto es así:

Primera migracion aplicada

Si corres en la terminal knex migrate:rollback verás que la tabla se borra. Hay que tener mucho cuidado al hacerlo, porque puedes borrar algo que no querías.

Con ésto ya tenemos nuestra primera migración. Ven que fácil?

Ahora podrás probar de nuevo las consultas que hicimos en el post anterior.

Bendiciones y Happy Coding!

Sígueme en mi canal de Telegram.