André Carlucci

Skeptic .net development

Controlando a versão de seu banco de dados com Sharp Migrations

Sharp migrations é um framework para te ajudar a controlar as mudanças no banco de dados com o passar do tempo. A ideia vem das excelentes migrações do Ruby on Rails e é provavelmente a melhor maneira de alterar sua base de dados de forma estruturada e organizada.

Como funciona?

A ideia é simples: crie uma classe para cada mudança que você deseja realizar em uma base de dados. Esta classe irá conter tanto as ações (sqls) que devem ser aplicadas para executar esta mudança como também as ações para removê-la (upgrade e downgrade da base). Sendo assim, cada classe representa uma versão de seu sistema de gerenciamento de base de dados.

Quais bases de dados posso utilizar?

Até o momento, 4. Você sempre escreve as instruções em “c#” e o Sharp Migrations vai executar SQLs na base de dados que você quiser, bastando especificar qual provider usar. Dentre os providers suportados, temos:

  • Oracle.DataAccess.Client
  • System.Data.SqlClient
  • MySql.Data.MySqlClient
  • System.Data.SQLite

Ok, agora show me the code!

Abra a solução de seu projeto no visual studio e crie um novo projeto de Console.

Instale o SharpMigrations via NuGet:

Vá no seu app.config e configure o log4net e sua connection string:

[xml]
<configSections>
<section name=”log4net” type=”log4net.Config.Log4NetConfigurationSectionHandler,log4net”/>
</configSections>
<log4net>
<appender name=”trace” type=”log4net.Appender.TraceAppender, log4net”><br />
<layout type=”log4net.Layout.PatternLayout,log4net”>
<param name=”ConversionPattern” value=”%d [%t] %-5p %c – %m%n”/>
</layout><br />
</appender>
<appender name=”console” type=”log4net.Appender.ConsoleAppender, log4net”><br />
<layout type=”log4net.Layout.PatternLayout,log4net”>
<param name=”ConversionPattern” value=”%d [%t] %-5p %c – %m%n”/>
</layout><br />
</appender>
<root>
<priority value=”ALL”/>
<appender-ref ref=”trace”/><br />
</root>
<root>
<priority value=”INFO”/>
<appender-ref ref=”console”/><br />
</root>
</log4net>
<connectionStrings><br />
<add name=”Migrations”<br />
connectionString=”data source=.SQLEXPRESS;Integrated Security=True;Initial Catalog=SharpMigrationsTest;”<br />
providerName=”System.Data.SqlClient” /><br />
</connectionStrings><br />
[/xml]

Não esqueça de criar a base “sharp” (ou qualquer outro nome) no seu SqlServer!

Usando o runner

O runner é a classe que vai “rodar” suas migrations. Vamos usar o ConsoleRunner para este caso. Vá no seu Program.cs e coloque as seguintes linhas:

Adicione também a DLL System.Configuration para termos acesso ao app.config. E pronto, agora basta escrevermos nossas Migrations :)

Criando suas migrations

Vamos supor que você queira criar uma classe chamada Artista. Para ações do tipo DDL, você usa uma SchemaMigration e como disse antes, você deve escrever código para criar a tabela e também para destruí-la. Adicione uma nova classe chamada 001_CrieTabelaArtistas:

O método Up() é chamado toda vez que você quer avançar uma versão na base de dados. O método Down(), para desfazer.

Certo e para mudanças do tipo DML? Como por exemplo já popular a base com alguns dados?

É tão simples quanto, basta criar uma DataMigration. Vamos adicionar um artista em nossa tabela:

E como se controla a ordem das versões?

Você notou que eu sempre comecei as classes com um número equivalente a sua versão? O framework vai entender que o primeiro nome que aparecer no nome da classe é sua versão. Simples assim, sem annotations ou regras fixas.

Nomes válidos são:

  • 001Foobar
  • Foobar001
  • Foo001bar
  • Foo001bar

Lembre-se: é o primeiro número! Então Migration001Algo002 será a versão 1.

Action!

Tudo pronto. Para popular seu banco de dados, basta apertar F5 e escolher a versão.

Experimente colocar -1 e olhar as tabelas criadas no Server





Rode de novo coloque 0, a base vai ser desfeita:





Você pode ir para qualquer versão arbitrária também. Vá para última versão novamente (-1) e depois rode para versão 1:






E é isso. Não tem coisa melhor que baixar um projeto do seu controle de versão, apertar F5 e já ter sua base prontinha para rodar. Tudo automatizado :)