Migraciones de bases de datos en PHP: herramientas y prácticas modernas
Las migraciones de bases de datos son una parte esencial del desarrollo moderno en PHP. Permiten a los equipos de desarrolladores sincronizar los cambios en el esquema de la base de datos, rastrear el historial de cambios y aplicarlos automáticamente en diferentes entornos (entorno local, staging, producción). En este artículo, analizaremos las principales bibliotecas y herramientas para migraciones en PHP, su instalación, configuración y ejemplos de uso.
¿Qué son las migraciones y por qué son necesarias?
Una migración de base de datos es un script que describe un cambio en el esquema: creación de una tabla, adición/eliminación de columnas, índices, claves foráneas. Las migraciones permiten:
- Versionar los cambios en la estructura de la BD junto con el código de la aplicación.
- Automatizar el despliegue en nuevos servidores.
- Revertir los cambios cuando sea necesario.
- Trabajar en equipo sin conflictos.
Bibliotecas populares para migraciones en PHP
1. Phinx (robmorgan/phinx)
Phinx es una de las bibliotecas independientes más populares para migraciones. No está vinculada a un framework específico y es compatible con MySQL, PostgreSQL, SQLite, SQL Server.
Instalación a través de Composer:
composer require robmorgan/phinxCreación del archivo de configuración phinx.yml:
paths: migrations: '%%PHINX_CONFIG_DIR%%/db/migrations' seeds: '%%PHINX_CONFIG_DIR%%/db/seeds'
environments: default_migration_table: phinxlog default_database: development development: adapter: mysql host: localhost name: myapp_db user: root pass: '' port: 3306 charset: utf8Ejemplo de migración (creación de la tabla users):
<?php
use Phinx\\Migration\\AbstractMigration;
class CreateUsersTable extends AbstractMigration{ public function change() { $table = $this->table('users', ['id' => false, 'primary_key' => ['id']]); $table->addColumn('id', 'biginteger', ['identity' => true]) ->addColumn('username', 'string', ['limit' => 50]) ->addColumn('email', 'string', ['limit' => 100]) ->addColumn('created_at', 'datetime') ->addColumn('updated_at', 'datetime', ['null' => true]) ->addIndex(['email'], ['unique' => true]) ->create(); }}Ejecución de migraciones:
vendor/bin/phinx migrate -e development2. Doctrine Migrations (doctrine/migrations)
Doctrine Migrations es parte del ecosistema de Doctrine ORM. Es ideal para proyectos que ya utilizan Doctrine. Es compatible con todos los SGBD populares.
Instalación:
composer require doctrine/migrationsConfiguración (migrations.php):
<?phpreturn [ 'table_storage' => [ 'table_name' => 'doctrine_migration_versions', ], 'migrations_paths' => [ 'App\\Migrations' => './migrations', ], 'all_or_nothing' => true, 'transactional' => true, 'check_database_platform' => true,];Ejemplo de migración:
<?php
namespace App\\Migrations;
use Doctrine\\DBAL\\Schema\\Schema;use Doctrine\\Migrations\\AbstractMigration;
class Version20240101000000 extends AbstractMigration{ public function up(Schema $schema): void { $table = $schema->createTable('products'); $table->addColumn('id', 'integer', ['autoincrement' => true]); $table->addColumn('name', 'string', ['length' => 255]); $table->addColumn('price', 'decimal', ['precision' => 10, 'scale' => 2]); $table->se