Back-End

8 jun, 2017

Desenvolvendo migrations utilizando Laravel

Publicidade

Migrations permitem a criação e manipulação de bancos de dados, tendo como objetivo fornecer uma série de recursos, como por exemplo, manter um histórico de alterações que a base de dados vai sofrendo ao longo do tempo, com esses históricos de alterações sendo mantido é possível reverter qualquer alteração feita, tornando melhor o gerenciamento das alterações realizadas ao banco de dados  funcionando como um controle de controle de versão.

O Laravel permite a criação de migrations de maneira relativamente fácil, para iniciar é criado um projeto, utilizando o código abaixo:

composer create-project --prefer-dist laravel/laravel migration

1. Configurando banco de dados

Para continuar, crie uma base de dados chamada migration, no exemplo é utilizado mysql para banco de dados, em um terminal digite:

mysql -u root -p

A imagem abaixo demonstra a execução do comando acima:                      

Acessando banco de dados pelo terminal

Será solicitada a senha de acesso para o usuário root do mysql, mas poderia ser qualquer outro usuário, apenas substituindo o root do código acima pelo nome de outro usuário, em seguida, após ter acessado digite o comando abaixo:

\g CREATE DATA BASE migration;

Segue a ilustração da execução desse comando:

Criação da base de dados chamada migration

O código acima demonstra que tudo correu bem no processo de execução, criando uma nova base de dados. Com o banco de dados criado, devemos informar os dados de conexão para a aplicação criada em Laravel, esses dados devem ser passados no arquivo .env, que pode ser localizado na raiz do projeto:

 

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=migration
DB_USERNAME=root
DB_PASSWORD=

2. Criando uma migration           

Após configurar a conexão na aplicação será criada a primeira migration, que é especifica para a criação de uma tabela no banco de dados, sua criação acontece através do seguinte comando:

php artisan make:migration criar_tabela_alunos --create=aluno

O código acima utiliza o comando artisan do Laravel para criar uma migration, ela nada mais é que uma classe que irá tornar possível a manipulação da tabela de alunos que será criada na base de dados, além do comando php artisan make:migration criar_tabela_alunos , ele faz uma chamada para –create=aluno que define o nome da tabela a ser criada na base de dados a partir dessa migration. A mensagem a seguir será retornada ao final execução:

Criando uma migration utilizando o Laravel

 

Após a execução do comando o arquivo da classe criada poderá ser acessado no seguinte diretório: migration/database/migrations/2017_05_26_163323_criar_tabela_alunos

Observação: O Laravel, por padrão, traz alguns arquivos de exemplo nesse diretório. Os mesmos foram removidos para criação do exemplo deste artigo.

A estrutura de uma migration

A classe criada é uma Migration que possui a estrutura básica de métodos e pacotes já definidas pelo Laravel, essa classe ficará responsável por criar uma tabela chamada alunos no banco de dados:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CriarTabelaAlunos extends Migration
{
    public function up()
    {
        	Schema::create('aluno', function (Blueprint $table)
	 {
           		$table->increments('id');
            		$table->string('nome', 80);
            		$table->string('email', 80);
            		$table->integer('registro');
            		$table->timestamps();
        	});
    }

    public function down()
    {
        	Schema::dropIfExists('aluno');
    }
}

O código acima inicia informando quais classes deverão ser utilizadas para construir uma migration, sendo elas:

use Illuminate\Support\Facades\Schema;

Fornece um Facade para que seja possível manipular quais ações serão executadas no banco de dados, no caso, para o método up() esse facade é utilizado para executar a criação de uma tabela no banco de dados e no método down() o mesmo é serve também para executar um drop em uma tabela existente no banco.

use Illuminate\Database\Schema\Blueprint;

A classe Blueprint oferece ações que são pertinentes às entidades em si, por exemplo, a partir dessa classe é possível acessar métodos que irão definir como as colunas dessa tabela deve se comportar, a definição de tipos, tamanhos, e controles de chaves primárias e estrangeiras também são de responsabilidade dessa classe.

use Illuminate\Database\Migrations\Migration;

Migration é uma classe abstrata que é utilizada para definir o tipo da classe que está sendo criada e que deverá estender à classe Migration.

Após definir e estender a classe Migration é criado o método up(), demonstrado na linha abaixo:

public function up();

Esse método será o responsável por criar a tabela de alunos na base de dados, a implementação do método prossegue fazendo uso do Facade Schema, demonstrado abaixo:

Schema::create(‘aluno’, function (Blueprint $table));

O uso do Facade consiste na definição da ação que deseja executar no banco de dados, no caso é desejável criar uma tabela então é utilizado o método create, em seguida é criada uma função anônima que recebe em seu parâmetro através da técnica de injeção de dependência a classe Blueprint sendo referenciada através da variável $table. Com o objeto sendo passado para o contexto da função é possível interagir com seus métodos para informar quais colunas, tipos e respectivos tamanhos deverão ser criados, o código abaixo demonstra como essa interação acontece:

 

$table->increments('id');
$table->string('nome', 80);
$table->string('email', 80);
$table->integer('registro');
$table->timestamps();

A primeira linha irá criar um campo chamado ID do tipo inteiro com auto incremento, já as duas linhas que seguem irão criar colunas do tipo VARCHAR, um a chamada nome com tamanho de 80 e uma chamada email com o mesmo tamanho, é criado uma coluna do tipo inteiro chamada registro que deverá armazenar uma sequência numérica, a última linha, cria colunas para data de criação, data de atualização e data de exclusão que devem armazenar valores do tipo DATETIME.

O último método dessa classe é public function down() que utiliza o Facade Schema para, caso exista, deletar a tabela que é passada como parâmetro, sendo demonstrado no código abaixo:

Schema::dropIfExists('aluno');

4. Executando uma migration

Com a classe responsável por executar a migration é possível executar o seguinte comando em um terminal:

php artisan migrate

O comando acima será responsável por executar as classes que estiverem localizadas no pacote migration/database/migrations/, e caso não seja identificado nenhum erro será criada a tabela Alunos na base de dados que a aplicação estiver conectada. A imagem abaixo demonstra o banco de dados após a execução da migration:

Exibindo as tabelas criadas após execução da migration   

A tabela chamada migrations armazena o nome das classes de migration e cada vez que for criada uma nova seu nome será inserido nessa tabela.

5. Atualizando uma migration

Logo, equipes que trabalham no desenvolvimento de software utilizando migration tem ganhos diretos no que diz respeito a manuteniblidade do banco de dados, supondo que seja desejável inserir uma nova coluna chamada senha, para realizar essa ação basta adicionar a seguinte linha ao código da classe de migration:

$table->string('senha', 80);

Após inserir a linha de código mostrada acima é só executar o seguinte comando artisan no terminal:

php artisan migrate:refresh

A saída desse comando está ilustrada na imagem a seguir:

Execução do comando php artisan migrate:refresh

O resultado da ação acima pode ser observado da seguinte forma, se conectando ao banco de dados pelo terminal ou qualquer outro programa que permita a execução de SQL, e, executando o comando DESCRIBE aluno; que está representado na ilustração abaixo:

Exibindo informações da tabela após atualização da migration

6. Desfazendo uma migration

Com migrations também é possível desfazer uma ação que tenha sido realizada no banco de dados para isso o Laravel fornece o comando php artisan migration:rollback. Para que seja possível testar e acompanhar essa ação de rollback será criado uma nova migration chamada criar_tabela_disciplina:

php artisan make:migration criar_tabela_disciplina --create=disciplina<strong>          </strong><strong>   </strong>

Depois de criada ela estará disponível no mesmo diretório que a migration aluno e pronta para a criação de seus atributos. Com a migration criada basta executar o comando abaixo para que o banco de dados seja atualizado com a criação da nova tabela:

php artisan migrate

O resultado da execução desse comando pode ser visto na base de dados que esta sendo utilizada, a imagem a seguir mostra que a tabela disciplina foi criada com sucesso.   

Listando tabelas existentes na base de dados

Agora, caso seja desejável retornar o banco de dados a um estagio anterior ao da criação da tabela disciplina, basta executar o seguinte comando:

php artisan migrate:rollback

A saída apresentada pode ser vista na ilustração abaixo: 

Execução do comando rollback

O comando rollback irá reverter à ação da última migration que tiver sido executada, levando a base de dados a um estado anterior. No exemplo a última migration executada foi a que criava a tabela de disciplina, ao consultar a base de dados poderá ser notada a ausência da tabela disciplina, ou seja, o comando desfez a ação realizada pela última migration, deixando a base de dados apenas com a tabela aluno, como pode ser visto na ilustração abaixo: 

Tabelas existentes na base de dados após execução de rollback

O Laravel também permite a execução de uma quantidade especifica de migrations, seguindo o código abaixo:

php artisan migrate:rollback --step=2

O comando acima reverte a ação das duas últimas migrations que tiverem sido executadas.

7. Conclusão

A alteração em uma base de dados durante o processo de desenvolvimento é um fator quase que inevitável, mas através do uso de migrations essa tarefa tende a ser feita com maior controle e segurança.

Existem benefícios diretos, como ser possível ter versões distintas da base e poder facilmente alterar essas versões, porém existe um cuidado que independe desse controle, dependendo das alterações que são desfeitas pode haver quebra na aplicação que utiliza essa base de dados, portanto deve-se estar atento a esse ponto.

A utilização de um framework que abstraia essa tarefa é um recurso indispensável que traz um ganho na manipulação da base de dados e o Laravel oferece recursos que são fáceis de serem utilizados.