Python Ve Couchdb

NoSQL veritabanı platformları son zamanlar gittikçe daha fazla ilgimi çekmeye başladı.Çunku artık MySql gibi veritabanları eskisi gibi yeterli gelmiyor.Yuksek veri girişlerinde veya çok fazla verinin olduğu veritabanlarında kasılmalar, şişmeler, donmalar gibi birçok sorun çıkarıyorlar.Bunların yanında hız olarak da bir zaman sonra insana gerçekten yeterli gelmiyor.Ben kişisel sitemi kodlarken aklımda hep hızlı bir db kullanma fikri vardı.Çunku MySql ile çok fazla problem yaşamıştım.Ve tekrardan yaşamak istemiyordum.Bu yuzden PostgreSQL'i denemek için seçtim.Şu anda işimi çok fazla goruyor.Ama bunu sadece denemek için yaptım ve aklımda yatan asıl fikir nosql platformlardan birisini kullanmak.Bu platformların başında MongoDB ile CouchDB geliyor.Ben bu yazımda CouchDB'yi python veya django uygulamalarınızda nasıl basitçe kullanacağınızı gostereceğim.

Python Django NoSql CouchDb

Öncelikle sizlerinde bir linux kullanıcısı olduğunu varsayıyorum ve direk gerekli paketlerimizin kurulumuna geçiyorum.Öncelikle bilgisayarımızda couchdb kurulu olmalı.Uygun paket yoneticinize gore couchdb uygulamasını bilgisayarınıza kurun.Ubuntuda couchdb-bin isimli uygulamayı kurduğumda hata ile karşılaştım.Bu yuzden synaptic paket yoneticisine girip couchdb ve couchdb-dev gibi paketleride kurdum.

Eğer bilgisayarınızda couchdb başarı ile kuruldu ise couchdb'yi başlattığınızda aşağıdaki gibi bir ekran gelmesi lazım.(sudo couchdb komutuyla başlatırsanız hata almazsınız)

Apache CouchDB 1.0.1 (LogLevel=info) is starting.
Apache CouchDB has started. Time to relax.
[info] [<0.32.0>] Apache CouchDB has started on http://127.0.0.1:5984/

Şimdide python içinde kullanabilmemiz için gerekli olan modulleri kuruyoruz.Bunun için pip ve easy_install kullanabilirsiniz.Ben favorim olan pip'i kullanıyorum ve size de onu oneriyorum.

sudo pip install couchdb

Şimdi de gerçekten başarıyla kurulmuş mu diye iPythondan kontrol edelim.

In [1]: from couchdb import *

In [2]: s = Server("http://127.0.0.1:5984/")

In [3]: s
Out[3]:

In [4]: len(s)
Out[4]: 1

In [5]: s.
s.config     s.delete     s.resource   s.tasks      s.version    
s.create     s.replicate  s.stats      s.uuids

Gorduğunuz gibi once import ettik ve daha sonra serverımızı ayarladık.Couchdb on tanımlı olarak 5984 portunu kullanıyor.İsterseniz bunu /etc/couchdb içindeki ayar dosyasından(default.ini) değiştirebilirsiniz.Ayrıcana bu portun dışarıya açılması içinde gerekli olan ayarlar bu dosyada yer alıyor.

len(s) komutuyla toplam kaç tane veritabanımız olduğunu kontrol ettik.Bizden once couchdb içine bir adet veritabanı eklemiş.Şimdi de biz bir tane ekleme yapalım.

In [6]: s.create("dosyalar")
Out[6]:

In [7]: len(s)
Out[7]: 2

Dosyalar adında bir veritabanı ekledik ve kontrol ettik gerçekten eklenmiş mi diye.Şimdide butun veritabanlarımızı listeleyelim.

In [8]: for x in s:
   ...:     print x
   ...:     
dosyalar
_users

Kayıtlı olan 2 veritabanımızı gorduğunuz gibi çektik.Şimdide en son eklediğimiz dosyalar veritabanımızı silelim.

In [9]: del s["dosyalar"]

In [10]: len(s)
Out[10]: 1

Python ve CouchDB kullanmak ne kadar da basit değil mi? Şimdi de veritabanımız içine bir tablo ekleyelim ve buna ilk verilerini girelim.

In [11]: db = s.create("dosyalar")

In [12]: len(db)
Out[12]: 0

In [13]: db.create({'type':'Dosya','baslik':'Deneme Dosyasi','txt':'Iste oyle bir sey'})
Out[13]: '97b270042933231539fb1ed07e000141'

In [14]: len(db)
Out[14]: 1

Evet tam duşunduğunuz gibi sozluk içerisinde ilk kısım kolon ikinci kısım ise o kolonlardaki veriler.Ve şimdi bir başka veri ekleyelim.

In [15]: db['deneme'] = {'type':'Dosya','baslik':'diger deneme','txt':'buraya guzel bisiler yaz'}

In [16]: db['deneme']
Out[16]:

Şimdi de bu eklediğimiz verileri nasıl çekeceğimize bakalım.

In [17]: a = db['deneme']

In [18]: a['baslik']
Out[18]: 'diger deneme'

In [19]: a
Out[19]:

Buraya kadar zaten Python bilginiz varsa olayın nasıl olduğunu ve nasıl kullanılacağı hakkında az çok bilgi edindiniz.Şimdi de bu veritabanlarında nasıl sorgu çalıştıracağımıza bakalım.Eskisi gibi SQL sorguları yerine javascript ile sorgular gerçekleştiriliyor.

In [20]: fonksiyon = "function(d) { if (d.baslik.length>4) emit(d.baslik,null); }"

In [21]: for sira in db.query(fonksiyon):
   ....:     print sira.key
   ....:     
Deneme Dosyasi
diger deneme

Kim derdi ki javascript ile SQL sorgusu gerçekleştirebileceğimizi.Ama işte zamanla ne kadar da gelişti.Eminim daha da gelişecektir.Şimdi bu butun yaptıklarımızı guzel bir ornek ile tamamlayalım.

In [1]: from couchdb import *

In [2]: s = Server('http://127.0.0.1:5984/')

In [3]: db = s.create('yazilim')

In [4]: db['Firefox'] = {'type':'browser','baslik':'FireFox'}

In [5]: db['Safari'] = {'type':'browser','baslik':'Safari'}

In [6]: db['Aquamacs'] = {'type':'editor','baslik':'Aquamacs'}

In [7]: len(db)
Out[7]: 3

In [8]: browserlar = 'function(d) { if (d.type == "browser") emit(d.baslik,d); }'

In [9]: [ x.key for x in db.query(browserlar) ]
Out[9]: ['FireFox', 'Safari']

In [10]: del s['yazilim']

Kodlarımızı satır satır incelersek once coucdb'yi import ettik daha sonra serverımızı tanımladık.Bu serverda yazilim adında bir veritabanı oluşturduk ve bunu db isimli değişkene atadık.Bu veritabanında Firefox, Safari ve Aquamacs isimlerinde tablolar oluşturduk ve içlerine birkaç veri ekledik.Daha sonra veritabanımızı len fonksiyonu ile olçtuk ve 3 değerini aldık.Bunun anlamı veritabanında 3 tablo var.Daha sonra ise browserlar isimle değişkende javascript komutuyla sadece type == browser olan verileri almayı sağladık.Ve bunu sorguyu veritabanımızda çalıştırdık.Gelen değerleri list comprehension(gerçekten turkçesini bilmiyorum) yontemiyle ekrana bastık.Son olarak da bu oluşturduğumuz veritabanını sildim.

Bu anlattıklarım ile python uygulamarınızın veritabanı eksikliğinde kullanabilirsiniz.Ama bence CouchDB'yi Django ile birlikte kullanmak daha mantıklı.Bunun içinde birkaç değişiklik yapmamız yeterli.Zaten bu değişiklikleri views kısmında kullanacağız.Mesela settings.py dosyamıza COUCHDB_SERVER adında bir değişken atayıp hangi serverı kullanacağımızı ekleyelim.Daha sonra views dosyamızı aşağıdaki gibi bir hale getirelim.

from django.http import Http404,HttpResponseRedirect
from django.shortcuts import render_to_response
from couchdb import Server
from couchdb.client import ResourceNotFound

SERVER = Server('http://127.0.0.1:5984')
if (len(SERVER) == 0):
    SERVER.create('yazilar')

def index(request):
    yazilar = SERVER['yazilar']
    if request.method == "POST":
        baslik = request.POST['baslik'].replace(' ','')
        yazilar[baslik] = {'baslik':baslik,'icerik':""}
        return HttpResponseRedirect(u"/yazi/%s/" % baslik)
    return render_to_response('yazilar/index.html',{'rows':yazilar})

Djangodaki views mantığını biliyorsanız yukarıda tam olarak ne yaptığımı anlamış olmalısınız.Benim burada ufak bir onerim olacak ve hardcode'lardan uzak durmak için aşağıdaki gibi kullanabilirsiniz.(settings.py dosyası içinde tanımladığımız değişkeni aşağıdaki gibi alıp kullanabiliriz)

from django.conf import settings
SERVER = Server(getattr(settings,'COUCHDB_SERVER','http://127.0.0.1:5984'))

Özetle NoSql guzel bir teknoloji.Kullanın, deneyin, test edin.Eğer gerçekten ihtiyaç hissederseniz kullanmanız size kalmış birşey.

comments powered by Disqus