FluentMigrator ile Veritabanı Değişiklik Yönetimine Giriş (Database Upgrade & Migration)

FluentMigrator ile ilgili bir uygulamayı anlatmadan önce hangi ihtiyaca cevap verdiğini anlatmamız daha doğru olur. Yazılım projelerimizde genel olarak verilerimizi tutmak için bir veritabanı kullanıyoruz. Veritabanı şeması da, gelişen yazılım ile paralel olarak değişiyor. Kolonlar yaratılıyor, foreign keyler ekleniyor, tablolar güncelleniyor, yeni tablolar ekleniyor, varolanlar siliniyor. Geliştirme ortamında yapılan bu tür değişikliklerin düzgün bir şekilde, production, staging ortamlarına aktarılması gerekiyor.

Veritabanı değişikliklerinin elle yapılması, çok büyük risklere kapı açacaktır. Veritabanında herhangi bir aksaklığın ortaya çıkması, uygulamanın çalışmasını engelleyecektir. Bu yüzden de veritabanı güncellemesini otomatize edebileceğimiz bir araca gereksinim duymaktayız.

FluentMigrator, veritabanı değişikliklerini yönetmek için kullanabileceğimiz, c# ile geliştirilmiş bir araçtır.

Desteklediği veritabanları:

  • MySql
  • Oracle 11g
  • Sqlite
  • Sql Server 2000
  • Sql Server 2005
  • Sql Server 2008
  • Sql Server 2012
  • Sql Server 2014
  • PostgreSQL
  • Firebird
  • SqlServerCe
  • DB2

Böyle bir aracı kendimizde yazabiliriz. Fakat açık kaynak kodlu, yüzbinlerce indirme sayısına ulaşmış böyle bir araç varken, kendimizin uğraşarak böyle bir araç geliştirmesi zaman kaybı olacaktır. Veritabanı değişiklik senaryolarımızın çoğunu FluentMigrator karşılamaktadır. Jenkins ve Teamcity gibi continuous integration araçlarıyla entegre çalışmaktadır.

Migrationlarımızı, c# sınıfları tanımlayarak yapacağız, böylece veritabanına özgü sql cümleleri kullanmadan, yani alter table, add column gibi ddl cümlelerini yazmaya gerek kalmadan, C# evreninde kalarak veritabanı değişikliklerimizi yönetebileceğiz.

FluentMigrator kütüphanesinin temel parçası Migration sınıfıdır.  Biz veritabanı değişikliklerimizi bu sınıftan genişletilmiş sınıflar oluşturarak yapacağız.

Kurulum ve Örnek FluentMigrator Sınıfları

Migrationları tanımlayacağımız sınıfları bir class library projesinde barındırabiliriz. Öncelikle bir class library projesi oluşturalım.

Kurulumları her zamanki gibi nuget kullanarak yapalım.

Tools paketini de kuralım. Niçin kullanacağımızı ilerde açıklayacağım.

Artık ilk migration sınıfımızı yazabiliriz. İlk tablomuzu oluşturmak istiyoruz. Person tablosu oluşturacağız.

Şimdi yazdığımız sınıfı biraz açıklayalım.

PersonMigration, Migration sınıfından extend edilen bir sınıf. Attribute olarak sınıfın başında bulunan Migration(1) ifadesini açıklayalım. 1 sayısı, migration’un versiyonunu ifade ediyor. Yeni  bir migration sınıfı ekledikçe, bu rakamı arttırıyoruz. FluentMigrator bu rakama göre sıralayarak, migrationlarımızı çalıştırmaktadır.

Migration sınıfından extend edilmiş tüm sınıflar, iki metodu Up ve Down metodlarını implement etmek zorundadır.

Up metodunda, yapılması istenen işlemi tanımlıyoruz. Down kısmında, yapılan değişikliği geri almak için yapılan kısmı tanımlıyoruz. Down kısmını implement ederken iyi düşünmek gerekiyor. Tablo create ediyorsak, bu işlemi geri alırken, tablonun silinmesi bir seçenek fakat bu tablonun silinmesi bazı riskleri beraberinde getirebilir. Önemli dataların silinmesi sorunlara yol açabilir. Bu yüzden down kısmının iyi düşünülmesi gerekir.

Veritabanı Değişikliklerinin Gerçekleştirilmesi (Migrate.exe)

Tanımlamalarımızı yaptık. Artık Migrate.exe programını kullanarak, veritabanında tablomuzu oluşturabiliriz.

Bu örnek için MySql veritabanını kullanıyorum.

Migrate.exe programı, daha önce kurmuş olduğumuz FluentMigrator.Tools paketinin bulunduğu dizinde bulunmaktadır.

Paketin kendi bilgisayarımdaki yeri:

Komut satırı penceresini açıp aşağıdaki komutu çalıştıralım:

Veritabanı bağlantı kısmını kendi veritabanınıza göre değiştirin ve komutu çalıştırın.

komutsatiri

Artık Person tablomuz create edilmiş oldu.

Tabloları oluşturmak için Migrate.exe programını kullanmak zorunda değiliz. Msbuild veya nant taskları ile de migration işlemini yapabiliriz.

Yazılım geliştirmeye devam ediyoruz. Bir süre sonra Person tablosuna yeni bir kolon eklenmesi gereksinimi ortaya çıktı. Surname kolonu eklememiz gerekiyor.

Şimdi yeni bir migration sınıfı oluşturalım. PersonSurname sınıfını oluşturalım.

Migration’un versiyon no’sunun 2 olduğuna dikkatinizi çekerim.

Tekrar Migrate.exe komutunu çalıştıralım.

Person tablosuna Surname kolonunun eklenmiş olduğunu görürüz.

Peki bu komutu geri alabilir miyiz? Evet Migrate.exe komutunu rollback parametresi ile çalıştırırsak, yaptığımız işlemi geri alabiliriz:

/task rollback –steps=1 parametresi, bir versiyon geriye gitmeyi ifade ediyor.

komutrollback

Person tablosuna bakarsak, Surname’ın kaldırılmış olduğunu görürüz. Down metodunda belirtmiş olduğumuz işlem çalışmış oldu.

Benzer şekilde tüm sql ddl komutlarını, (alter table, alter column, create foreign key vs… ), FluentMigrator’un sunduğu c# metodları ile çalıştırabiliriz.

Execute.Sql metodu ile istediğimiz sql cümlesini çalıştırabiliriz. FluentMigrator’un sunduğu fluent syntaxı bizim istediğimiz sql’leri yazmamıza imkan vermiyorsa, Execute.Sql ile istediğimiz sql’i doğrudan yazabiliriz.

App.Config Kullanımı

Migrate.exe komutunu çalıştırırken her seferinde, connection string bilgilerini yazmak yerine App.Config dosyası kullanabiliriz.

App.config dosyasında connection bilgilerini yazarsak, komut satırında Migrate.exe programına veritabanı bağlantı bilgilerini parametre olarak girmemize gerek kalmayacaktır.

Projemize Add New Item diyerek Application Config File dosyası ekleyelim. Bu dosyayı aşağıdaki şekilde değiştirelim:

Bu şekilde app.config dosyasını kullanarak Migrate.exe komutunun kullanımını basitleştirmiş oluruz:

Evet yazımızın sonuna gelmiş olduk. Yazı ile ilgili eleştirilerinizi, önerilerinizi yorum olarak yazmaktan çekinmeyin.

 

 

Yorum Gönder

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Scroll to Top