South ile Django da Migration İşlemi

Posted on Cts 11 Nisan 2015 in Python, Django

Django da oluşturduğunuz bir uygulamada Modelinizi yazdınız ve syncdb parametresi ile veritabanı tablolarını oluşturdunuz. Daha sonra model sınıfınızda tablo yapısını etkileyecek düzenlemeler yaptınız ve tekrar syncdb ile tablonuzu oluşturmaya çalıştınız. Bir baktınız ki tablo da bir değişiklik yok, olduğu gibi duruyor. Bu Django’nun zayıf yanı oluyor ve güncel veritabanı tablonuzu oluşturmak için önceki tabloyu silmeniz gerekiyor. Ayrıca tablonuzun varolan sütunlarını etkilemeyen bir düzenleme varsa; bu değişiklik yeni sütun ekleme gibi bir şeyse ve tablonuz da ki mevcut veriler yerinde dursun diyorsanız Django’dan bunu şimdilik beklemeyin. Belki ileride bu özelliği eklerler…

Yukarıdaki gibi bir durum ile karşı karşıyaysanız South modülünü kullanmak durumundasınız. Öncelikle South modülünü kuralım: Bu modülü kurmanız için; ya buradan istediğiniz sürümü indirip kuracaksınız, ya setuptools modülü kuruluysa

easy_install South

komutuyla kuracaksınız, ya da easy_install ile pip modülünü kurup

pip install South

komutuyla modülü kurabilirsiniz.

South modülünü kurduysanız bir Django projesi oluşturup, uygulama oluşturalım…

django-admin.py startproject southdenemesi
cd southdenemesi
python manage.py startapp blog

southdenemesi adında bir proje oluşturduk. Sonra bu proje dizinine girip blog adında bir uygulama oluşturduk. blog dizinine girip models.py dosyasını metin düzenleyici ile açıp basit olarak şunu yazalım:

from django.db import models

class Post(models.Model):
  title = models.CharField(max_length=255)
  content = models.TextField()

Sonra proje dizinine dönüp settings.py dosyasını metin düzenleyicisi ile açalım.

INSTALLED_APPS = (
    # ...
    'south',
    'blog',
    # ...
)

Veritabanı ayarınızı yaptıktan sonra south ile birlikte blog uygulamamızı projemize ekliyoruz ve dizin içerisinde konsolu açıp tablolarımızı oluşturuyoruz.

python manage.py syncdb

Ardından

python manage.py convert_to_south blog

ile uygulamamızı south modülü için ilklendiriyoruz. Sonra models.py dosyamızı şu şekilde değiştiriyoruz.

from django.db import models

class Post(models.Model):
  title = models.CharField(max_length=255)
  content = models.TextField()
  pub_date = models.DateTimeField(auto_now_add=True)

Modelimizdeki değişikliği southa bildiriyoruz.

python manage.py schemamigration blog --auto

Bu komutu verince bize iki seçenek sunacaktır. “2″ yazıp devam ettiğimizde bize sütunun boş bırakılamayacağı için tarih bilgisi girmemizi istiyor(Eğer veri varsa her satır için aynı tarih verisi işleniyor sanırım). Bunu da

datetime.datetime.now()

kodunu yazarak hallediyoruz ve migration yani göç dosyamız, blog uygulamamızın içinde oluşturulan migrations dizininde 0002 ile başlayan bir Python dosyası olmuş oluyor. Oluşturulan göç dosyasını uygulamak için

python manage.py migrate blog

komutunu veriyoruz ve yeni tablo sütunu tablomuzdaki yerini alıyor. Eğer south uygulamasını projeye ekleyip syncdb ile tablosunu oluşturduktan sonra bir uygulama eklerseniz ilklendirmek için

python manage.py schemamigration uygulama --initial

işlemek için de

python manage.py migrate uygulama

komutunu veriyoruz. Daha sonraki düzenlemeleri yukarıdaki gibi –auto parametresi ile işleyebilirsiniz… Benim bilgim bu kadar. Daha fazla bilgi için buraya bakabilirsiniz. Hatam varsa bildiriniz.