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.
Kaynakça
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 migBuradaki 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 UyeBize 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 migrateBu 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... OKHer ş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 migBu 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)
Migrations for 'mig': 0002_uye_soyad.py: - Add field soyad to uyeGö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 migrateBu 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... OKHer ş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