29 Temmuz 2013 Pazartesi

Djangoda south Nedir ? Ne işe yarar ?

Modeller oluşturup ,veritabanını oluştuduğunuzu varsayalım. İçerisine verileri yerleştirdiniz. Ama zaman geçti ve modele yeni bir özellik eklemek istediniz ,yeni bir alan ya da var olan alanı değiştirmek veya silmek. Djangoda bunu sadece modeli değiştirerek yapamazsınız. Djangonun zayıf yönlerinden birtanesidir bu. Siz değişikliği yapsanızda syndb yaptığınızda veritabanı değişmez. Bunun için veritabanını silip tekrardan syncdb işlemi yapılmalı. Fakat bu durumda verilerinizi kaybedersiniz buda mantıklı bir çözüm olmamakta. Umarım djangonun ileri sürümlerinde, modeli değiştirdiğimizde veriler silinmeden yeni özellik alanlarının direk gelmesi özelliğini eklenir. Şimdilik bu problemi çözmek için South aracı geliştirilmiş. İlk olarak south aracını kurmamız gerekir.
pip install South

kurduktan sonra bu aracı kullanmak istediğimiz uygulamada INSTALLED_APPS ın içinde belirtmeliyiz.
INSTALLED_APPS = (
# ...
'south',
# ...
)

İlk Migration
Syncdb işlemininin ardından south modelimizi ilklendirmeliyiz. Henüz daha veritabanımıza veri eklemedik. Burada veritabanı boşken eklenen migration anlatılacak.ilk yaptığımız modele migration yaparsak, ilk migration olarak alır. Onun üzerinde yapılan her değişikliği yeni bir migration olarak kaydeder. Migration olmasını istediğiniz app’ı ilklendirmek gerekmektedir. Şu şekilde:
python manage.py schemamigration app_ismi --initial
ardından bize 1 mi 2 gibi tarzında soru sorduğunda 2 yi seçip
  • datetime.date.today()
  • yazmanız yeterli olacaktır.
    oluşturmuş olduğumuz migrationı uygulamak için değişikliği yaptığımız app modelinden etkilenen app’leri migrate yapmalıyız.Bu dosyaları zaten programı koştuğumuzda uyarı olarak bize belirtecektir.Yapmanız gereken o dosyalar için:
    python manage.py migrate app_ismi
    yazmak.Birden fazla dosyanız varsa sadece:

    python manage.py migrate

    yazmanız yeterli.
    Normal Migration
    Migration dosyalarınızı oluşturdunuz ve ilklendirilmiş dosyanızda sonrasında değişiklik yapma ihtiyacı hissettiniz. O halde:
    python manage.py schemamigration app_ismi --auto
    değişikliği yaptığınız app’te auto işlemini gerçekleştirmeniz gerekmektedir. Daha sonra bu modeli import ettiğiniz appleri migrate etmeniz gerekmektedir, yani bu değişiklikten etkilenen appleri.
    manage.py migrate app_name
    eğer birden fazlaysa sadece
    manage.py migrate
    yazmanız yeterli olacaktır.
    App Dönüşümü
    Yukarıda anlatılan işlemler veritabanımıza henüz veri eklemeden önce , daha sonra yapılacak değişikliklere karşı oluşturulan migrationdan bahsedildi. Şimdi ise bu başlık altında var olan veriler üzerinde sonradan eklenen migration olayları anlatılacak. Diyelim proje oluşturuldu veritabanı hazır veriler yerleştirildi sonradan migrate işlemleri eklemek istediniz. Yukarıda ki işlemleri django anlayamaz o hep var olan veri tabanını muhafaza etmeye çalışır.Bu durumda migration işlemleri şu şekilde gerçekleştirilir.
    manage.py convert_to_south app_ismi

    yaparak app’a south dönüşümü yapılır. Ardından o appı ilklendirmek gerekir
    python manage.py schemamigration app_name --initial

    ilklendirilen app’tan etkilenen dosyalara sahte migrateler yapmak gerekir.
    python manage.py migrate app_ismi 0001 --fake
    bu sayede sonradan migrate işlemlerini sahte olarak yaparız. Normal migrationdan farksızdır.
    Sonraki migrationlarda yine aynı yapı olan:
    python manage.py schemamigration app_ismi --auto
    python manage.py migrate

    komutları ile migrationları gerçekleştirebiliriz.
    ÖZET
    Veritabanı işlemlerinde var olan modelleri sonradan değiştirme işlemlerinde migration kullanımına göz attık. Yapılan migrationlara göz atmak isterseniz şu komutu kullanmanız yeterli olacaktır.
    manage.py migrate --list