Migraciones de base de datos con Phinx

Cuando uno piensa que una aplicación va a ser muy pequeña como para usar un framework completo o un framework que no tiene migraciones para base de datos, y los cambios a la base de datos generalmente se hacen a mano. Pero luego de un tiempo el sistema sigue creciendo y el equipo también crece, es importante que los cambios a la estructura de la base de datos sean versionados dentro del repositorio.

Aquí es donde entra una excelente herramienta phinx un paquete de PHP escrito por Rob Morgan que es agnóstico a los frameworks. Puede ser instalado en cualquier proyecto de PHP usando composer. Permite crear migraciones en el ambiente de desarrollo que una vez probadas completamente, serán aplicadas en ambientes de pruebas y producción.

Phinx permite a los desarrolladores alterar y manipular la base de datos en una manera clara y concisa. No ejecuta SQL directamente sino que ofrece una API poderosa para crear migraciones usando código PHP. Esto hace que las migraciones de phinx sean portables entre diferentes motores de bases de datos. Phinx sabe cuales migraciones ya se ejecutaron, así que no tienes que llevar cuenta de cuales migraciones tienen que ejecutarse.

Para instalar solo necesita:

$ composer require robmorgan/phinx

Y crear una carpeta donde se almacentarán las migraciones, generalmente db/migrations.

Para iniciar el uso de phinx se ejecuta:

$ vendor/bin/phinx init

Revisar el archivo phinx.php donde se debe especificar las diferentes conexiones a las bases de datos.

Para crear una nueva migración con

$ vendor/bin/phinx create CrearTablaUsuarios

Una migración es una clase php con un nombre único, que se crea con el método change o que puede se puede cambiar para tener los métodos up y down. Y dentro de este método se utiliza el api de phinx para realizar las operaciones de cambios. Up para cambiar la estructura y down para reversar el cambio si hacemos un rollback. O simplemente change se usa para hacer el cambio y que phinx infiera la reversión. Por ejemplo las siguientes funciones son frecuentes al escribir migraciones:

$this->table('usuarios')
->addColumn('name', 'string')
->addColumn('created_on', 'datetime')
->create();

$this->table('usuarios')
->removeColumn('name', 'string')
->udpate();

Se aplica la migración con:

$ vendor/bin/phinx migrate -e development

donde -e indica que conexión definida en phinx.php usar

Se reversa la migración con:

$ vendor/bin/phinx rollback

Verificar el estado del ambiente:

$ vendor/bin/phinx status

También se puede usar phinx para crear archivos Seed para generar datos en la base de desarrollo. Pueden investigar más en la documentación que es muy completa.