Migrações de banco de dados em PHP: guia completo sobre ferramentas e bibliotecas
O desenvolvimento de aplicações web em PHP está intrinsecamente ligado ao gerenciamento da estrutura do banco de dados. Durante a evolução do projeto, o esquema do banco de dados muda constantemente: novas tabelas são adicionadas, campos são alterados, índices são introduzidos. A execução manual de consultas SQL em diferentes ambientes (ambiente local, staging, produção) leva a erros, perda de dados e confusão. A solução para esse problema são as migrações de banco de dados — uma forma programática de versionar e aplicar alterações no esquema.
O que são migrações e por que são necessárias?
Uma migração é uma classe PHP que contém dois métodos: up() (aplicar alterações) e down() (reverter alterações). Cada migração possui um identificador único (geralmente um timestamp) e é executada sequencialmente. As principais vantagens de usar migrações:
- Versionamento do esquema do banco de dados — todo o histórico de alterações é armazenado no código (geralmente no Git).
- Automação de implantação — basta executar um comando para atualizar o banco de dados em qualquer servidor.
- Segurança — possibilidade de reverter alterações malsucedidas.
- Trabalho em equipe — todos os desenvolvedores sincronizam a estrutura do banco de dados automaticamente.
Bibliotecas populares para migrações em PHP
Vamos analisar as três ferramentas mais comuns: Phinx, Doctrine Migrations e as integradas Laravel Migrations.
1. Phinx (robmorgan/phinx)
Phinx é uma ferramenta independente de framework para migrações e seeding (preenchimento com dados de teste). Ele suporta MySQL, PostgreSQL, SQLite, SQL Server e outros SGBDs. A instalação é feita via Composer:
composer require robmorgan/phinxExemplo de migração para criar a tabela de usuários:
<?phpuse Phinx\\Migration\\AbstractMigration;
class CreateUsersTable extends AbstractMigration{ public function up() { $table = $this->table('users'); $table->addColumn('username', 'string', ['limit' => 50]) ->addColumn('email', 'string') ->addColumn('password', 'string') ->addColumn('created_at', 'datetime') ->addIndex(['email'], ['unique' => true]) ->create(); }
public function down() { $this->table('users')->drop()->save(); }}Phinx oferece um DSL (Linguagem Específica de Domínio) conveniente para descrever o esquema, além de suporte integrado para seeds (seeders). Comandos principais:
phinx migrate— aplicar todas as novas migrações.phinx rollback— reverter a última migração.phinx status— mostrar o status das migrações.phinx seed:run— preencher o banco de dados com dados de teste.
2. Doctrine Migrations
Doctrine Migrations — parte do ecossistema Doctrine ORM, mas pode ser usado sem ele. Destaca-se pela poderosa integração com Doctrine DBAL (camada de abstração de banco de dados). Instalação:
composer require doctrine/migrationsExemplo de migração usando Doctrine DBAL:
<?phpuse Doctrine\\DBAL\\Migrations\\AbstractMigration;use Doctrine\\DBAL\\Schema\\Schema;
class Version20240101000000 extends AbstractMigration{ public function up(Schema $schema) { $table = $schema->createTable('users'); $table->addColumn('id', 'integer', ['autoincrement' => true]); $table->addColumn('username', 'string', ['length' => 50]); $table->addColumn('email', 'string'); $table->setPrimaryKey(['id']); $table->addUniqueIndex(['email']); }
public function down(Sc