15 Aralık 2013 Pazar

Django'da Veritabanı-1

Merhaba Arkadaşlar

Şimdiye kadar Django'nun nasıl çalıştığını öğrendik. Bildiğiniz gibi dinamik web uygulamaları verileri veritabanında tutarlar. Bu blogumda da sizlere Django'nun veritabanı bağlantısının nasıl yapıldığını ve veritabanı temel fonksiyonlarının nasıl kullanıldığını basit bir öğrenci bilgi sistemi örneği üzerinden anlatmak istiyorum. Burada her ne kadar SQL komutu işlemeyeceksek de, SQL komutlarını bilmemiz konuya daha da hakim olmamızı sağlayacaktır.

Django'nun veritabanı uygulamaları için kullanıcılarına sunduğu en büyük kolaylık; kullanıcının  SQL tablolarını oluşturmaması ve sorgularla uğraşmaması olabilir diye düşünüyorum. Biraz garip geldiğinin farkındayım. Gelin birlikte bakalım.

Django ön tanımlı olarak PostgreSQL, MySQL, SQLite ve Oracle desteği ile gelir. Veritabanı yapılandırması proje klasöründe bulunan settings.py dosyası içerisinde yapılır. Bu dosyanın DATABASES bölümü aşağıdaki gibidir:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': '',                      # Or path to database file if using sqlite3.
        'USER': '',                      # Not used with sqlite3.
        'PASSWORD': '',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}
  (Blog sayfasının genişliğinden dolayı yazıda kaymalar olmuş olabilir.)

Hangi veritabanı sistemini kullanıyorsak bunu ENGINE parametresinde belirtiriz. Bu parametreler: postgresql_psycopg2, mysql, sqlite3 ya da oracle olabilir. Ayrıca django.db.backends. ön takısını kullanırız. Bağlantının nasıl yapıldığını öğrendiğimize göre artık örneğimize başlayabiliriz. Örneğimiz basit bir okul veritabanı örneği olacaktır. Okulumuzda öğretim elemanı, ders ve öğrenci sınıflarını tanımlayacağız. Projemizin adı okul olsun. Projelerimizi oluşturduğumuz konuma gelerek yeni bir proje oluşturalım. Bunu daha önceki bloglarımdan da hatırlayacağınız üzre şöyle yapıyorduk:

> C:\Python27\python.exe C:\Python27\Lib\site-packages\django\bin\django-admin.py startproject okul 

SQLite bir sunucu sistemi gereksinimi olmadan çalışan veritabanı sistemidir. Böylelikle veritabanı sunucusu yönetimine gereksinim duymadan işimizi yürütebiliriz. üstelik farklı yerlerde geliştirme yapıyorsak, veritabanı dosyasıda proje klasöründe olacağından taşıma sorunumuz da olmayacaktır.

Şimdi projemizin veritabanı yapılandırmasını yapmak üzere proje klasörümüzdeki settings.py dosyasını açalım ve aşağidaki satırları dosyanın başına ekleyelim.

import os.path
konum = os.path.dirname(__file__)
ustDizin = os.path.split(konum)[0]

Daha sonra DATABASES değişkenini aşağıdaki gibi yapılandırlaım:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': os.path.join(ustDizin,'var/okul.db'),                      # Or path to database file if using sqlite3.
        'USER': '',                      # Not used with sqlite3.
        'PASSWORD': '',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}
 (Blog sayfasının genişliğinden dolayı yazıda kaymalar olmuş olabilir.)

SQLite için NAME parametresine veritabanı dosyasının tam patikası yazılır. Eğer dosya yok ise oluşturulur. Şimdi de Veritabanı dosyasının oluşturulacağı dizini oluşturalım. Bunu da komut satırından şöylece yapalım:

> mkdir C:\...\DjangoProjeleri\okul\var

Projeler genellikle karmaşık yapıya sahiptirler. Bu karmaşıklığın üstesinden gelebilmek için Django'da uygulamalar açılır. Biz ilk olarak yonetim uygulamasını geliştireceğiz. Bu uygulamada basit olarak öğretim elemanı, ders, öğrenci ve öğrencilerin aldıkları derslerigireceğiz. Artık proje klasörümüze girerek uygulamamızı oluşturalım :

C:\...\DjangoProjeleri > cd okul
C:\...\DjangoProjeleri\okul > C:\Python27\python.exe manage.py startapp yonetim

Yukardaki komut ile yonetim adında bir klasör ve içerisine temel uygulama dosyalarımız oluşturulur. Şimdi sıra uygulamamızı projemize eklemede, bu amaçla C:\...\DjangoProjeleri\okul\okul\settings.py dosyasını açıp  INSTALLED_APPS değişkenine yonetim uygulamamızı ekleyelim.

settings.py
                                                                                                                                
INSTALLED_APPS = (
    #'django.contrib.auth',
    #'django.contrib.contenttypes',
    #'django.contrib.sessions',
    #'django.contrib.sites',
    #'django.contrib.messages',
    #'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'yonetim',
)
                                                                                                                                

Django'da SQL tablolarının ve sorguların yapılabilmesi için bazı tanımlamalar yapmamız gereklidir. Yani burada sadece tablolar ve bu tablolardaki alanları tanımlıyoruz. Bu tanımlamalar da model diye adlanrılır.
Artık modelimizi oluşturabiliriz. Bunun için C:\...\DjangoProjeleri\okul\yonetim\models.py açıp aşağıdaki tanımlamaları yapalım:
models.py
from django.db import models

class OgretimElemani(models.Model):
    adi = models.CharField(max_length =50)
    soyadi = models.CharField(max_length =50)
    telefonu = models.CharField(max_length =10,blank=True)
    e_posta_adresi = models.EmailField(blank = True)
 
class Ders(models.Model):
    kodu = models.CharField(max_length =10)
    adi = models.CharField(max_length =50)
    ogretim_elemani = models.ForeignKey(OgretimElemani)
    tanimi = models.EmailField(max_length=1000, blank = True)


class Ogrenci(models.Model):
    numarasi = models.IntegerField()
    adi = models.CharField(max_length =50)
    soyadi = models.CharField(max_length =50)
    aldigi_dersler = models.ManyToManyField(Ders)
 

Herhangi bir alanın seçeneğe bağlı olarak girilmesini sağlamak için, o alanı tanımlarken blank= True argümanını eklememiz gerekmektedir.  Ayrıca Ogrenci modelindeki
aldigi_dersler = models.ManyToManyField ( Ders ) satırı ile de öğrencinin aldığı ders tablosu oluşturulacaktır. Tabloları oluşturmadan önce modellerimizde ve diğer yapılandırmalarımızda bir hata olup olmadığını denetleyelim. Bunun için aşagıdaki komut satırını yazalım:


> C:\Python27\python.exe manage.py validate

Eğer sonuç  0 errors found herhangi bir sorun yok demektir. Artık tablolarımızı oluşturabiliriz. Bunun için ise aşağıdaki kod satırı yeterli olacaktır:


> C:\Python27\python.exe manage.py syncdb
Creating tables ...
Creating table yonetim_ogretimelemani
Creating table yonetim_ders
Creating table yonetim_ogrenci_aldigi_dersler
Creating table yonetim ogrenci
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

Tablolarımız oluşturuldu. Sıra tablolara veri eklemede.   Bunun için Django kabuğunu (shell) açalım:

> C:\Python27\python.exe manage.py shell

VERİ EKLEME 
Önce birkaç öğretim elemanı ekleyelim:

>>> from yonetim.models import *
>>> ogrelm1 =OgretimElemani(adi='Hakan',soyadi='Kaya',telefonu='123456789',e_posta_adresi='hakankaya@kaya.com')
>>> ogrelm1.save()
>>> ogrelm2 =OgretimElemani(adi='Ali',soyadi='Taş',telefonu='987123456',e_posta_adresi='alitas@tas.com')
>>> ogrelm2.save()
>>> ogrelm3 =OgretimElemani(adi='Mustafa',soyadi='Keser',telefonu='',e_posta_adresi='')
>>> ogrelm3.save()
>>> ogrelm4 =OgretimElemani(adi='Mustafa',soyadi='Kaya',telefonu='654789123',e_posta_adresi='')
>>> ogrelm4.save()

Kayıtların veritabanına işlenmesi için mutlaka save() fonksiyonunu kullanmamız gerekir. Aksi halde tanımlanma yapılmış olur ama veri tabanına eklenmez. Şimdi veritabanına eklediğimiz bir veri satırına ulaşmaya çalışalım.

>>> ogrelm1
<OgertimElemani: OgretimElemani object>

Gördüğünüz gibi pek de açıklayıcı bir bilgi vermedi bize. Daha düzgün bir görünüm için modelin __unicode__() işlevini tanımlamamız gerekiyor. OgretimElemani modelimizi aşağıdaki gibi güncelleyelim ve kaydedelim.

...
class OgretimElemani(models.Model):
    adi = models.CharField(max_length =50)
    soyadi = models.CharField(max_length =50)
    telefonu = models.CharField(max_length =10,blank=True)
    e_posta_adresi = models.EmailField(blank = True)

    def __unicode__(self):
        return u'%s, %s' %(self.soyadi,self.adi)
...

Değişikliklerin etkin olabilmesi için Django kabuğunun (shell'in) yeniden başlatmalıyız.

Bir modeldeki tüm veriyi almak için object.all() özelliğini kullanabiliriz:

>>> from yonetim.models import *
>>> ogretimelemanlari = OgretimElemani.objects.all()
>>> ogretimelemanlari
[<OgretimElemani:Kaya, Hakan>,<OgretimElemani:Taş, Ali>,
<OgretimElemani: Keser, Mustafa>,<OgretimElemani:Kaya, Mustafa>]


Siz de diğer modellerin görünümünde bize bilgi vermesi için __unicode__() işlevlerini istediğiniz gibi tanımlayabilirsiniz. Şimdi bir ders ekleyelim ve dersin öğretim elemanının Hakan Kaya yapıp kaydedelim.

>>>ders1 = Ders(kodu='BIM101', adi ='programlamaya giriş')
>>>ders1.ogretim_elemani = ogretimelemanlari[0]
>>>ders1.save()

Bu işlemi aşağıdaki gibi tek de yapabiliriz:

>>>ders1 = Ders(kodu='BIM101', adi ='programlamaya giriş', ogretim_elemani= ogretimelemanlari[0])
>>>ders1.save()

Şimdi iki tane daha ders ile bir öğrenvi ekleyip öğrenciye eklediğimiz dersleri ekleyelim:

>>>ders2 = Ders(kodu='BIM222', adi ='Internet Programlama', ogretim_elemani= ogretimelemanlari[1])
>>>ders1.save()
>>>ders3 = Ders(kodu='BIM333', adi ='Veri yapıları', ogretim_elemani= ogretimelemanlari[2])
>>>ders1.save()
>>>ogr1 = Ogrenci(numarasi= 123, adi ='Mehmet', soyadi='Keskin')
>>>ogr1.save()
>>>ogr1.aldigi_dersler.add(ders2,ders3)


Herhangi bir öğrencinin aldığı derslere de şu şekilde bakabiliriz:

>>>ogr1.aldigi_dersler.all()
[<Ders: BIM222: Internet Programlama>,<Ders: BIM333: Veri yapıları>]

Ve aldığı herhangi bir dersini de silebiliriz:

>>>ogr1.aldigi_dersler.remove(ders3)
>>>ogr1.aldigi_dersler.all()
[<Ders: BIM222: Internet Programlama>]

Eğer tüm derslerini silmek istersek de aldigi_dersler.clear() özelliğini kullanabiliriz.

Referanslar :
  1. https://docs.djangoproject.com/en/dev/
  2. BAŞER, Mustafa (2013). Django

Hiç yorum yok:

Yorum Gönder