11 Ocak 2012 Çarşamba

Symfony2 Veritabanı degisiklikler - database migrations

Bir süredir PHP framework'u Symfony2 ile ilgileniyorum. Daha önceki versiyonlarında biz yazılım geliştiricilerin hayatını kurtaran özellikleri olan Symfony2, yeni versiyonuyla daha performanslı, daha basit ve daha esnek bir yapıyla karşımıza çıkıyor. Her ne kadar eski versiyonda olan admin-generator gibi muhteşem araçları henüz "resmi" olarak içermese de (bazı geliştiricilerin yüklenebilir ek paketleri var), yeni projelerimizi Dubluve olarak Symfony2'de geliştirme kararı aldık :) Daha önceden Ruby On Rails'ta kullandığım ve çok faydalı bulduğum "database migrations" özelliğinin Symfony2'nin resmi paketlerinden biri olduğunu öğrendiğimde gerçekten çok sevindim. Database migrations, veritabanında sık sık değişiklik olan projelerde, bu değişikliklerin takibini kolaylaştıran ve değişiklikleri tek tek uygulamayı ve geri almayı sağlayan bir özelliktir. Her yapılan değişiklik için bir migration kaydı (Symfony2'de bu kayıt bir PHP sınıfı, Ruby On Rails'te Ruby sınıfıdır) oluşturulur. Bu sınıfta genel olarak iki farklı fonksiyon yardımıyla yapılan değişiklik ve geri alma işlemleri tanımlanır. Kurulum Symfony2'de database migrations özelliğini kullanmak için DoctrineMigrationsBundle isimli paketi kurmak gerekiyor. Hali hazırda çalışan bir Symfony2 projemiz olduğunu varsayarak, bu paketi kurabilmek için deps dosyasına aşağıdaki satırları ekliyoruz: [doctrine-migrations] git=http://github.com/doctrine/migrations.git [DoctrineMigrationsBundle] git=http://github.com/symfony/DoctrineMigrationsBundle.git target=/bundles/Symfony/Bundle/DoctrineMigrationsBundle Daha sonra paket kurulumunun başlaması için, komut satırında proje klasörüne geçiyor ve tüm paketlerin güncellenmesi için ilgili komutu çalıştırıyoruz. Projenin D:\ diskinde olduğunu vekullandığımızı varsayıyorum: cd d:\wamp\www\{proje_klasoru} php bin/vendors install Paket kurulumu tamamlandı, fakat şu an bu paketi projemizde kullanamıyoruz. Paketi projede kullanabilmek için önce bu paketin ait olduğu namespace'i projemizin görmesini sağlamalıyız. Bunun için projemizin app klasöründe yer alan autoload.php dosyasına aşağıdaki şekilde ekleme yapıyoruz: $loader->registerNamespaces(array( //... 'Doctrine\\DBAL\\Migrations' => __DIR__.'/../vendor/doctrine-migrations/lib', 'Doctrine\\DBAL' => __DIR__.'/../vendor/doctrine-dbal/lib', )); Bu fonksiyonda başka satırlar da mutlaka olacaktır. Biz ek olarak DoctrineMigrationsBundle paketini bir namespace ile de yüklenmesini sağladık. Bu iki satırdan 'Doctrine\\DBAL' ile başlayan satırı zaten array içerisinde görebilirsiniz, eğer mevcut ise eklemenize gerek yok. Önemli bir nokta: 'Doctrine\\DBAL\\Migrations' ile başlayan satırı, 'Doctrine\\DBAL\\' ile başlayan satırdan mutlaka önce kullanmanız gerekiyor. Bu fonksiyonda namespace'ler listedeki sırayla kayıt edildiğinden, eğer 'Doctrine\\DBAL\\' satırını daha önce belirtirseniz, 'Doctrine\\DBAL\\Migrations' satırındaki namespace kayıt edilmeyecektir, Symfony bunu 'Doctrine\\DBAL\\' namespace altında kabul edecektir. Namespace kaydını tamamladık, şimdi paketi yüklenecek paketler listesine eklememiz gerekiyor. Yine app klasöründeki AppKernel.php dosyasına şu şekilde ekliyoruz: public function registerBundles() { $bundles = array( //... new Symfony\Bundle\DoctrineMigrationsBundle\DoctrineMigrationsBundle(), ); } Paket Kullanımı Paketle ilgili tüm ayarlar bitti, şimdi biraz kullanımdan bahsedelim. Öncelikle belirtelim ki, DoctrineMigrationsBundle paketi, Symfony2'yi komut satırından kullanırken bize ek komutlar sağlıyor. Bu da tabii ki migration kullanmak için büyük kolaylık sağlıyor. Windows komut satırında, projemizin klasöründeyken, aşağıdaki komutu çalıştırarak yeni migration komutlarını görebiliriz: php app\console | find "migrations" Bu komutlardan örneğin "status", bize şu anki durum hakkında bilgi verir: $ php app\console doctrine:migrations:status == Configuration >> Name: Application Migrations >> Database Driver: pdo_mysql >> Database Name: {veritabani_adi} >> Configuration Source: manually configured >> Version Table Name: migration_versions >> Migrations Namespace: Application\Migrations >> Migrations Directory: D:\wamp\www\{proje_klasoru}\app/DoctrineMigrations >> Current Version: 2012-01-10 09:00:34 (20120110090034) >> Latest Version: 2012-01-10 09:00:34 (20120110090034) >> Executed Migrations: 2 >> Available Migrations: 2 >> New Migrations: 0 DoctrineMigrationsBundle paketi, hangi değişikliklerin yapıldığını, şu an projenin hangi değişiklik versiyonunda olduğunu, veritabanında kendi tablolarında tutuyor. Yani tablo değişiklikleri için bir nevi versiyon kontrolü sistemi oluşturuyor. İlk yüklemeden sonra, paketin kendi tabloları henüz veritabanında olmadığı için, bu tabloları oluşturmak gerekiyor. Bu tabloları oluşturmak için komut satırında aşağıdaki komutları çalıştırıyoruz: php app\console doctrine:migrations:diff php app\console doctrine:migrations:migrate Yeni Migration Yaratmak Paket tabloları yaratıldı. Artık migrations kullanarak tablolarımızda değişiklikler yapabileceğiz. O zaman hemen bir migration sınıfı yaratalım ve içeriğini inceleyelim :) Yine komut satırında aşağıdaki komutu çalıştırıyoruz: php app\console doctrine:migrations:generate Yeni bir migration dosyası ve sınıfı projemizin app\DoctrineMigrations klasöründe yaratılmış oldu. Bu dosyada up() ve down() isminde iki fonksiyon bulunuyor. Bu fonksiyonlardan up() ilgili migration uygulandığında yapılacak değişikliği, down() ise bu değişiklik geri alındğında yapılması gerekenleri içeriyor. Bir migration dosyasının içeriği örneğin şu şekilde olabilir: addSql('CREATE TABLE addresses (id INT NOT NULL, street VARCHAR(255) NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB'); } public function down(Schema $schema) { $this->addSql('DROP TABLE addresses'); } } Her bir veritabanı değişikliği için yeni bir sınıf üretmek ve ilgili komutları burada tutmak biraz zor gelebilir. Fakat asıl güzel nokta burada ortaya çıkıyor: Symfony2'de veritabanı değişiklikleri otomatik tespit edilerek ilgili migration dosyası otomatik yaratılıyor. Mesela yeni bir alan ekledik, bunu ilgili entity sınıfına ekliyoruz, fakat migration oluşturmuyoruz. Komut satırından php app\console doctrine:migrations:diff komutunu çalıştırdığımızda, veritabanının mevcut hali ile entity sınıfları karşılaştırılıyor ve değişiklikler migration sınıfı olarak otomatik generate ediliyor. Bize sadece php app\console doctrine:migrations:migrate komutunu çalıştırmak ve yeni değişiklikleri uygulamak kalıyor. Eski Bir Migration Anına Dönmek Projemizin ilerleyen safhalarında, yaptığımız bazı değişiklikleri geri almamız gerekirse, istediğimiz herhangi bir ana dönmek de oldukça kolay. Yaratılan migration sınıflarının özel bir isimlendirme metodu olduğun fark etmişsinizdir. Bu sınıflar Version{migration_id}.php olarak oluşturulurlar. Buradaki migration_id ilgili değişikliği tekil olarak temsil eder. Eski bir migration anına (örneğin 20120110085916) dönmek için aşağıdaki komutu komut satırında çalıştırmak yeterli: php app/console doctrine:migrations:migrate 20120110085916 İşte bu kadar kolay! Hem database migration tanımıyla yeni tanışanlar, hem de daha önceden Ruby on Rails gibi framework'lerde bu özelliği kullanmış olanlar için umarım faydalı olmuştur. Zevkle yazılım geliştireceğiniz günler dilerim! Devamı için : Symfony2 Veritabanı degisiklikler - database migrations

Hiç yorum yok:

Yorum Gönder

Yorumunuzu esirgemeyiniz..