Migrations

Introdução

Data Base Migrations ou Scheme Migrations , são conjuntos controlados de mudanças desenvolvidas para modificar a estrutura dos objetos dentro de um banco de dados relacional. As migrations ajudam a transição dos esquemas de banco de dados de seu estado atual para um novo estado desejado, seja adicionando tabelas e colunas, removendo elementos, dividindo campos ou mudando tipos e restrições.

As migrations gerenciam mudanças incrementais, muitas vezes reversíveis, nas estruturas de dados de forma programática. Os objetivos do software de migration de banco de dados são tornar as alterações de banco de dados repetíveis, compartilháveis e testáveis sem perda de dados. Geralmente, o software de migration produz artefatos que descrevem o conjunto exato de operações necessárias para transformar um banco de dados de um estado conhecido para o novo estado. Estes podem ser verificados e gerenciados por software de controle de versão normal para rastrear mudanças e compartilhar entre os membros da equipe.

Embora prevenir a perda de dados seja geralmente um dos objetivos do software de migration, mudanças que caem ou modificam destrutivamente estruturas que atualmente abrigam dados podem resultar em exclusão. Para lidar com isso, a migration é frequentemente um processo supervisionado que envolve inspecionar os scripts de mudança resultantes e fazer quaisquer modificações necessárias para preservar informações importantes.

Quais são as vantagens das ferramentas de Migrations?

As migrations são uteis porque permitem que os esquemas de banco de dados evoluam à medida que os requisitos mudam. Eles ajudam os desenvolvedores a planejar, validar e aplicar com segurança mudanças de esquema em seus ambientes. Essas alterações compartimentalizadas são definidas em um nível granular e descrevem as transformações que devem ocorrer para se mover entre várias ”versões” do banco de dados.

Em geral, os sistemas de migrations criam artefatos ou arquivos que podem ser compartilhados, aplicados a vários sistemas de banco de dados e armazenados no controle de versão. Isso ajuda a construir um histórico de modificações no banco de dados que podem estar intimamente ligadas às alterações de código que acompanham nos aplicativos do cliente. O esquema de banco de dados e as suposições do aplicativo sobre essa estrutura podem evoluir em conjunto.

Alguns outros benefícios incluem ser permitido (e às vezes necessário) ajustar manualmente o processo, separando a geração da lista de operações da execução deles. Cada alteração pode ser auditada, testada e modificada para garantir que os resultados corretos sejam obtidos enquanto ainda dependem da automação para a maior parte do processo.

Fluent Migrator

Fluent Migrator (https://fluentmigrator.github.io/articles/intro.html) fornece uma maneira simples, mas eficiente de descrever e aplicar mudanças de esquema de banco de dados. Não precisamos aprender o DDL (Data Definition Language, linguagem de definição de dados) que vem com o banco de dados. Fluent Migrator cuida da tradução de C# para o dialeto DDL específico para o servidor de banco de dados selecionado, ou seja PostgreSQL em nosso caso. Observe que o DDL para diferentes RDMS’s pode ter pequenas variações, por exemplo.

O DDL do Postgres pode ser ligeiramente diferente do Oracle. Ocasionalmente, pessoas diferentes trabalhando na mesma base de código, mas em diferentes ramos precisam aplicar mudanças diferentes no mesmo esquema. Algumas ferramentas dificultam isso porque armazenam o estado do esquema quando uma migration também é aplicada. Então, na hora da fusão, isso pode trazer problemas que exigem soluções trabalhosas.

O Fluent Migrator evita isso por não armazenar o estado do esquema no banco de dados. Em vez disso, cada alteração recebe um identificador único e, em seguida, registra esse identificador. Esse mecanismo permite que o Fluent Migrator acompanhe as mudanças já aplicadas em um determinado banco de dados. Como resultado, conflitos de fusão são raros. Os identificadores também são usados para determinar a sequência em que as migrations são aplicadas. Uma migration para Fluent Migrator é simplesmente uma classe C#. Ele deriva de uma classe base abstrata que exige que seja implementado em métodos: Up() e Down().