As migrations são fundamentais em qualquer framework moderno, pois permitem controlar a evolução do banco de dados de forma versionada. Tanto no Django (Python) quanto no Laravel (PHP), migrations ajudam a manter consistência entre ambientes (desenvolvimento, teste e produção) e a trabalhar em equipe sem conflitos no schema do banco.
Apesar de possuírem a mesma finalidade, a forma como Django e Laravel lidam com migrations possui diferenças significativas.
1. Conceito de Migrations
Django: As migrations no Django são geradas automaticamente com base nas alterações feitas nos modelos (models.py). O framework analisa os modelos e cria arquivos de migration que descrevem as mudanças. O desenvolvedor raramente escreve migrations manualmente (embora seja possível).
Laravel: Já no Laravel, as migrations são geralmente escritas manualmente pelo desenvolvedor. Cada migration define instruções para criar, alterar ou excluir tabelas e colunas. É comum utilizar seeds e factories junto com migrations para popular o banco.
2. Criando uma Migration no Django
Exemplo: Criando um modelo Cliente
```python
from django.db import models
class Cliente(models.Model):
nome = models.CharField(max_length=100)
email = models.EmailField(unique=True)
criado_em = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.nome
```
Gerando a migration:
python manage.py makemigrations
Isso cria um arquivo em app/migrations/0001\_initial.py.
Aplicando a migration:
python manage.py migrate
3. Criando uma Migration no Laravel
Criando a migration via Artisan:
php artisan make\:migration create\_clientes\_table
Isso gera um arquivo em database/migrations/xxxx\_xx\_xx\_create\_clientes\_table.php.
Aplicando a migration:
php artisan migrate
4. Diferenças Principais
Criação:
* Django: automática a partir dos modelos
* Laravel: manual, escrita pelo desenvolvedor
Localização:
* Django: app/migrations/
* Laravel: database/migrations/
Sintaxe:
* Django: Python, orientação a objetos
* Laravel: PHP, Schema Builder com Blueprint
Rollback:
* Django: python manage.py migrate app 0001 ou usando --fake
* Laravel: php artisan migrate\:rollback
Seeds/Fixtures:
* Django: loaddata com fixtures JSON, YAML ou XML
* Laravel: db\:seed, com factories
Controle:
* Django: baseado em estados de modelos
* Laravel: baseado em scripts explícitos
5. Exemplo de Alteração de Campo
Django – adicionar campo telefone:
Basta adicionar o campo no modelo Cliente e rodar novamente:
python manage.py makemigrations
python manage.py migrate
Laravel – adicionar campo telefone:
php artisan make\:migration add\_telefone\_to\_clientes\_table --table=clientes
Arquivo gerado:
```php
public function up(): void
{
Schema::table('clientes', function (Blueprint $table) {
$table->string('telefone', 15)->nullable()->after('email');
});
}
public function down(): void
{
Schema::table('clientes', function (Blueprint $table) {
$table->dropColumn('telefone');
});
}
```
Executando:
php artisan migrate
Conclusão
Django é mais “automágico”: você altera os modelos e o framework gera migrations automaticamente.
Laravel é mais “explícito”: você cria manualmente migrations e define exatamente como o banco deve mudar.
Ambos têm vantagens:
* Django reduz erros por divergência entre modelos e banco.
* Laravel dá maior controle e clareza do que está sendo feito em cada alteração.