3 Eylül 2014 Çarşamba

Django 1.7 ve Migrations

Ve Django'nun 1.7 sürümü yayınlandı. Bu bizim için çok anlam ifade ediyor. Çünkü artık biz de Migration özelliğine sahibiz. Veritabanımızda oluşturmuş olduğumuz tablolara sütünlar ekleyebilir veya silebiliriz. Bildiğiniz gibi Django'nun 1.7'den önceki sürümünde bir tablo sadece bir kere oluşturuluyordu. Yani projeyi yaptıktan bir süre sonra tablo üzerinde değişiklik yapmanız demek tablo içerisindeki verileri kaybetmeniz demektir. Güncellenmiş halini yeniden oluşturmak için tabloyu silerek tekrardan oluşturmanız gerekiyordu. İşte bu sorun 1.7 ile birlikte gelen Migration ile ortadan kalktı. Elimizde şu şekilde bir model olduğunu düşünelim.
class Uye(models.Model):
    ad = models.CharField(max_length=100)
    yas = models.IntegerField(max_length=3)
Şimdi ilk önce yapmamız gereken makemigrations komutunu vererek migration dosyamızın oluşmasını sağlamak. Oluşturduğunuz proje içerisine bakarsanız migrations dizinini görebilirsiniz.
python manage.py makemigrations mig
Buradaki mig proje içerisinde oluşturduğumuz uygulamanın adıdır. Buna çıktı olarak şu şekilde bir şey alacaksınız.
Migrations for 'mig':
    0001_initial.py
     - Create model Uye
Bize modelimizin oluştuğunu söylüyor. Bundan sonra yapmamız gereken ise migrate komutunu vererek değişikliklerin veritabanında uygulanmasını sağlamak.
python manage.py migrate
Bu komutu verince değişiklikler veri tabanına uygulanacak. Alacağınız çıktı şu şekilde olacaktır.
Operations to perform:
  Apply all migrations: admin, contenttypes, mig, auth, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying mig.0001_initial... OK
  Applying sessions.0001_initial... OK
Her şey yolunda. Veritabanımız gayet güzel bir şekilde oluşturuldu. İşte Migration'ın bize kattığı güzellikler buradan sonra başlıyor. Bu modelde kullanıcının soy adını başka bir sütünda tutmak istediğimizi düşünelim. Eğer bunu 1.7'den önceki sürümlerde yapmak isteseydik. Tabloyu silerek yeniden oluşturmamız anlamına geliyordu. Buda kayıtlı olan tüm kullanıcıların silinmesi demekti. Şimdi bunu 1.7 ile beraber kolayca yapalım.
class Uye(models.Model):
    ad = models.CharField(max_length=100)
    soyad = models.CharField(max_length=100)
    yas = models.IntegerField(max_length=3)
Modeli bu hale getirdikten sonra tekrar migration komutlarını vermemiz gerekiyor. Ama burada dikkat etmemiz gereken bir husus var.
python manage.py makemigrations mig
Bu komutu çalıştırınca şu şekilde bir çıktı alacaksınız.
You are trying to add a non-nullable field 'soyad' to uye without a default;
we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows)
 2) Quit, and let me add a default in models.py
Select an option:
Django burada bize şunu söylüyor : "Sen bu modele soyadı sütününu eklemek istiyorsun. İyi güzel ama bu alan zorunlu. Daha önceden eklenmiş satırlar için default bir değer belirtmelisin ki bizde bu sütüna o değeri yazalım." Burada yapabileceğiniz bir kaç seçenek var onları sıralayalım.
  • 1. Bu gelen seçeneklerden 1 numaralı olanı seçerek eklenen her sütün için yazılmasını istediğiniz değeri girebilirsiniz. Örneğin soyad için seçimi yaptıktan sonra "soyad" yazarak enter tuşuna basabilirsiniz.
  • 2. Buradan 2 numaralı seçeneği seçtikten sonra modelde alana default değer ekleyebilirsiniz. Örneğin:
    soyad = models.CharField(max_length=100, default="soyad")
    
  • 3. Modelde alana zorunlu olmaması için blank, null tanımlamalarını yaparak nu alanın her sütün için boş bırakılmasını sağlayabilirsiniz.
    soyad = models.CharField(max_length=100, blank=True, null=True)
    
Bu seçeneklerden birini yaptıktan sonra komutu tekrar verirseniz değişiklikler başarı ile uygulanacak ve şu çıktıyı alacaksınız.
Migrations for 'mig':
  0002_uye_soyad.py:
    - Add field soyad to uye
Gördüğünüz gibi yeni bir migration dosyası oluşturuldu ve soyad alanı eklendi. Eğer uygulamanız içerisindeki migrations dizinini incelerseniz dosyaların oluştuğunu görebilirsiniz. Şimdi değişiliklerin veritabanı üzerinde gerçekleşebilmesi için migrate komutunu vermeliyiz.
python manage.py migrate
Bu komuta karşı alacağınız çıktı şu şekilde olacaktır.
Operations to perform:
  Apply all migrations: admin, contenttypes, mig, auth, sessions
Running migrations:
  Applying mig.0002_uye_soyad... OK
Her şey yolunda. Soyad alanımız veritabanına başarılı bir şekilde eklendi. İşte migration ile birlikte Django'nun en büyük sorunu ortadan kalkmış bulunmakta. Artık tabloları silmeden yeni sütünlar ekleyebilir veya var olan sütünları kaldırabilirsiniz.
Kaynakça

0 yorum :

Yorum Gönder