Ceviz Forum

Geri Dön   Ceviz Forum > Programlama > Python / Zope

Cevapla
 
LinkBack Seçenekler
Eski 26/05/2008, 01:02   #1 (permalink)
Yönetim Kurulu
 
Muallim-i Âli Adlı Üyenin Profil Grafiği
 
Üyelik Tarihi: 01/2008
Yer: İstanbul
Mesaj: 255
Varsayılan Python Altında SQLite Kullanımı

Yazan : Tutku

SQLite kullanıma hazır SQL veritabanı motoru görevini yerine getiren küçük bir C kütüphanesidir. Bu yazı bir Python kütüphanesi olan pysqlite'ı ve SQLite arayüzü olarak kullanımını anlatacaktır.

SQLite hızla popülerlik kazanan küçük bir veritabanı motorudur, ve bu popülerliği de devam edecekmiş gibi görünüyor. SQLite tek başına çalışır ve başka bir bağımlılığa ihtiyaç duymaz. Programın bilgiye erişmek için ihtiyaç [duyduğu tüm etkileşimler veritabanı tarafından yapılandırılır ve veri tabanı içinde tek bir dosyada saklanır. Bu yüzden karmaşık bir yapılandırma yoktur, SQLite küçüktür ve bir çok uygulamada da belirgin olarak hızlıdır.

Bir çok dil tarafından verilen destek sır değildir, fakat bir çok insan birden fazla Python SQLite kütüphanesi olduğunuz bilmez. Bu kütüphanelerden bir tanesi de zahmetsiz veritabanı etkileşimi sağlayan pysqlite'dır. Bu yazıda SQLite'ı, pysqlite'ı ve bunların kapasitelerini tanıyacağız. Bu işlem sırasında da Python altında daha önceden herhangi bir veritabanı deneyimi gerekmemektedir, genelde SQL ile tanıdık olduğunuz varsayılacaktır.

Kütüphaneye Sahip Olma

pysqlite kütüphanesine aşağıdaki websitesinden erişilebilir:

http://initd.org/tracker/pysqlite

Windows kullanıcıları basitçe indirerek ardından pysqlite dosyasını çalıştırarak ürünü kurabilirler. Linux ve diğer benzer işletim sistemi kullanıcılarının kaynak dağıtımı indirmeleri gerekir. Bunu yaparken de SQLite ve SQLite geliştirme dosyalarınınkurulu olması gerekir. Birçok dağıtım bu kütüphane ile birlikte gelir, bu yüzden ilk olarak denetlemeniz yararınızadır. Eğer dağıtımınızda kurulu değilse SQLite'ı kendi sitesinden çekebilirsiniz:

http://sqlite.org/

Kütüphane diğer birçok Python kütüphanesi gibi kurulur. İlk olarak kütüphaneyi yapılandıralım:

python setup.py build

Daha sonra, basitçe apılandırdığınız dosyayı kurun. Bunları yaparken de uygun yetkilere sahip olduğunuzdan emin olun:

python setup.py install

Eğer herşey beklenildiği gibi gitmişse pysqlite kurulmuş, kullanım için hazırdır.

Veritabanına Bağlanmak

Artık pysqlite'ı kullanmaya hazırız. Kütüphaneyi kullanabilmek için elbetteki içe aktarılması gerekir. pysqlite2 ismi ile bulunabilir, fakat bizim dbapi2 isimli alt modüle ihtiyacımız var. Bu alt modül sqlite ismi ile içe aktarılabilir.

>> from pysqlite2 import dbapi2 as sqlite

Artık pysqlite'ı kullanabiliriz. Yapacağımız ilk şey çalışacağımız veritabanını oluşturmaktır. Bu bağlantı nesnesi ve veritabanı dosyasının ismini oluşturarak yapılır. Eğer adını verdiğimiz veritabanı dosyası yok ise, yeni bir veritabanı dosyası oluşturulur. Eğer veritabanı dosyası varsa da eski dosya açlılır:

>> connection = sqlite.connect('test.db')

Belleğinizde geçici bir veritabanı oluşturmak da mümkündür:

>> memoryConnection = sqlite.connect(':memory:')

Birkere bağlantı nesnesini oluşturduktan sınra, birde imleç nesnesi oluşturmalıyız. Böylece bu nesne bizim için gerekli olan tüm etkileşimleri yapar. Bu oluşturma işi bağlantı nesnesi üzerinde imleç nesnesinin çağrılması ile yapılır:

>> cursor = connection.cursor()

Veri Yazmak

Şuan veritabanımızda bir tablo oluşturabiliriz. Bunu yapmak için imlecimiz üzerinde execute() yöntemini gerekli durumlardan geçerek çağırmalıyız. Şimdi isimleri ve e-posta adreslerini saklayacak tabloyu oluşturalım:

>> cursor.execute('CREATE TABLE names (id INTEGER PRIMARY KEY,
name VARCHAR(50), email VARCHAR(50))')

Tablomuz oluşturuldu artık içerisine execute metodunu kullanarak bazı veriler ekleyebiliriz:

>> cursor.execute('INSERT INTO names VALUES (null, "John Doe",
"jdoe@jdoe.zz")')

>>> cursor.execute('INSERT INTO names VALUES (null, "Mary Sue",
"msue@msue.yy")')

İmlecin son satırının numarasını da öğrenmemiz mümkün, bunun için şu komuta ihtiyacımız var:

>> cursor.lastrowid

Elbetteki kullanıcı girişimize bağlı olan değerlerde satırlara veri girmeliyiz. Kullanıcı girişini olduğu gibi kullanmak güvensizdir. Tehlikeli bir kullanıcı veri değerlerine kolayca ulaşabilir ve çok büyük zararlar verebilir. Bu kabul edilemez bir durumduz fakat ne mutlu ki pysqlite güvenliği garantiye alan bir yola sahiptir. Varsayalım ki bir kişinin isim ve e-posta adresi iki değişkende saklansın:

>> name = "Luke Skywalker"
>>> email ="use@the.force"

Artık bu değişkenler bizim tarafımızdan tanımlandıklarından beri güvenlidirler. Bu değişkenleri sorguya güvenli bir şekilde eklemek için de bu değişkenlerin yerine soru işaretleri konulur, ve böylece pysqlite daha dikkatli olur:

>> cursor.execute('INSERT INTO names VALUES (null, ?, ?)',
(name, email))

Bu andan itibaren değişikliklerimizin kabul edilmesi için dosyayı kaydetmemiz gerekir. Bu işlem de bağlantımız üzerine commit metodu çağrılarak olur:

>> connection.commit()

Eğer bir bağlantıyı kaydetmeden kapatmaya kalkışırsanız, pysqlite bir hata döndürür. Buna rağmen eğer siz yaptığınız değişiklikleri kaydetmek istemiyorsanız bu davranız bazı sorunlara yolaçabilir. Bu yüzden rollback() yöntemi uygulanır, bu yöntem ile kaydedilmemiş değişiklikler silinir. Örneğin tablomuza başka bir satır ekleyelim:

>> cursor.execute('INSERT INTO names VALUES (null, "Bobby John", "bobby@john.qq")')

Şimdi değişikliklerin etkinleşmesini istemediğimizi varsayalım, bunun için basitçe rollback yöntemi çağrılır:

>> connection.rollback()

Artık değişiklikler silinmiş durumdadır.

Verinin Geri Alınması

Artık veritabanımızdan veriyi "SELECT" ile sorgulayarak geri alabiliriz. İlk olarak tablodaki tüm değişkenleri alalım:

>> cursor.execute('SELECT * FROM names')

İmleç artık ablodaki tüm değişkenleri içerir, veriyi almanın bir çok yolu vardır. İlk yol fetchall() yönetimi ile dönen sorgunun her satırının listelemektir:

>> cursor.execute('SELECT * FROM names')
>>> print cursor.fetchall()
[(1, u'John Doe', u'jdoe@jdoe.zz'), (2, u'Mary Sue',
u'msue@msue.yy'), (3, u'Luke Skywalker', u'use@the.force')]

Dolu bir tüp listesinin nasıl döndüğüne dikkat edin, her tüp bir satırdadır. Tüm verileri bir döngüye sokmak çok basittir.Tüm bunlar için for döngüsü kullanılabilir. Buna rağmen dönen veri üzerinde daha kolay bir döngü yolu belirteceğim:

> cursor.execute('SELECT * FROM names')
>>> for row in cursor:
print '-'*10
print 'ID:', row[0]
print 'Name:', row[1]
print 'E-Mail:', row[2]
print '-'*10

----------

ID: 1
Name: John Doe
E-Mail: jdoe@jdoe.zz

----------

----------

ID: 2
Name: Mary Sue
E-Mail: msue@msue.yy

----------

----------

ID: 3
Name: Luke Skywalker
E-Mail: use@the.force

----------

Fetchall yönetminin kullanımı çok kolaydır, bir kere veriyi imlece aldıktan sonra içeriği istediğiniz gibi listeleyebilirsiniz. Diyelim ki imlece eklenen verilerin tüm satırlarını listelemek istemiyorsunuz, bu durumda fetchmany yönetmi daha uygun bir seçim olacaktır. Bu yöntem ile tek bir tamsayı belirtilir, bu tamsayı imlec içeriğine kaçıncı satırın aktarılacağını belirtir. Bu yöntem ile her seferinde bir satır içeriği geri döndürülür:

>> cursor.execute('SELECT * FROM names')
>>> print cursor.fetchmany(2)
[(1, u'John Doe', u'jdoe@jdoe.zz'), (2, u'Mary Sue',
u'msue@msue.yy')]

Sıradaki satırının içeriğini de istediğiniz zamanda geri alabilirsiniz:

>> print cursor.fetchmany()
[(3, u'Luke Skywalker', u'use@the.force')]

Fetchall yönetmi gibi fetchmany yöntemi de her satırda bir içerik olacak şekilde bir tüp listesi döndürür.

Son olarak bir de fetchone yöntemi vardır. Bu yöntem tek bir satırın içeriğini imlece aktarıyor, fakay fetchmany yönetminden farklı olarak satırın tüpünü değer olarak döndürüyor. Fetchone yönetmi liste döndürmez. Eğer tek bir satır değeris döndürmek istiyorsanız bu yöntem en kullanışlı olanıdır:

>> cursor.execute('SELECT * FROM names')
>>> cursor.fetchone()
(1, u'John Doe', u'jdoe@jdoe.zz')

Bir de next isimli yöntem vardır, ve bu yöntem de fetchone'a benzer, aynı anda sadece tek bir satır değeri döndürür. Buna rağmen ğeer imlec icerisinde işlenmeyen içerik kalmamışsa "None" değeri döndürmek yerine StopIteration hatası verir:

>> cursor.execute('SELECT * FROM names')
>>> cursor.next()
(1, u'John Doe', u'jdoe@jdoe.zz')
>>> cursor.next()
(2, u'Mary Sue', u'msue@msue.yy')
>>> cursor.next()
(3, u'Luke Skywalker', u'use@the.force')
>>> cursor.next()
Traceback (most recent call last):
File "", line 1, in -toplevel-
cursor.next()
StopIteration

Uyarlama ve Dönüşüm

Pysqlite'in ilginç bir özelliği de SQLite veritabanında diğer tür bilgilerinin vekillerini saklayabilme yeteneğidir. Örneğin diyelim ki veritabanında saklamak istediğimiz örnekler sınıfı olsun. SQLite bilgilerin sadece birkaç türünü saklayabilir, fakat biz sınıfımızın örneklerini SQLite'in türlerine deönüşümü için zorlayabiliriz. Sonrada örneği geri alabiliriz ve en sonundada geri dönüştürürüz.

Birşeyler yapmadan önce, bağlantımızı sonlandırıp yeni tipleri algılaması için talimatlar ile yeniden açmalıyız:

>> cursor.close()
>>> connection.close()
>>> connection = sqlite.connect('test.db', detect_types =
sqlite.PARSE_DECLTYPES)
>>> cursor = connection.cursor()

Şimdi yeni türümüz için bir sınıf oluşturalım. Devamında isimler ve e-posta aderslerini belirleyeceğiz. Kişi sınıfı oluşturmuş olacağız. Pysqlite'ın bizi alt sınıf nesen ve yeni-stil sınıf için zorlayacığını unutmayın:

>> class Person (object):
def __init__ (self, name, email):
self.name = name
self.email = email

Yeni türümüz için tanımalam alanı ve tek bir sayıyı saklayacak tabloyu oluşturalım:

>> cursor.execute('CREATE TABLE people (id INTEGER PRIMARY KEY,
information Person)')
>>> cursor.commit()

Daha sonra nesnemizin metne çevrileceği yolu ve bu yolun tersinir sürecini oluşturmalıyız. Bu işi iki işlev kullanarak yapabiliriz:

>> def personAdapt (person):
return person.name + "n" + person.email
>>> def personConvert (text):
text = text.split("n")
return Person(text[0], text[1])

İlk işlev isim ile e-posta adresi arasına boşluk karakteri ekler, ve bunları tek bir dizgede toplar.İkinci işlev ise bu karakterden itibaren bu dizgeyi ayırır ve iki dizgeli bir nesne oluşturur. Bu çok basittir. Daha sonra bu iki işlevimizi uyarlayıcı ve dönüştürücü olarak kaydetmeliyiz:

>> sqlite.register_adapter(Person, personAdapt)
>>> sqlite.register_converter("Person", personConvert)

Artık herşey düzgünce ayarlandı. Kişi sınıfına örnekler ekleyebilir ve bu örnekelri geri alabiliriz. İlk olarak bir örnek yaratalım ve ekleyelim:

>> socrates = Person('Socrates', 'socrates@ancient.gr')
>>> cursor.execute('INSERT INTO people VALUES (null, ?)',
(socrates,))
>>> connection.commit()

Şimdi de bu bilgiyi geri alalım ve nesne bilgilerini yazdıralım:

>> cursor.execute('SELECT * FROM people')
>>> row = cursor.fetchone()
>>> print row[1].name, row[1].email
Socrates socrates@ancient.gr

Sonuç

SQLite etkileyici bir veritabanı motorudur. Veritabanı sunucusuna ihtiyaç duyan diğer veritabanı motorlarının tersine SQLite normal dosyaları veritabanı gibi kullanır. Ayrıca bağlımlılıklara ve yapılandırmaya da gereksinim duymaz. Buda SQLite mükammel bir taşınabilir yazılım yapar.

Özgün Metin : http://www.devshed.com/c/a/Python/Us...Lite-in-Python
Muallim-i Âli hatta değil   Alıntı Yaparak Yanıtla
Cevapla

Bookmarks

Seçenekler

Mesaj Yazma Hakları
Yeni mesajgöndermezsiniz
Cevap yazamazsınız
Dosya ekleyemezsiniz
Mesajınızı düzenleyemezsiniz

BB code is Açık
[IMG] kodu Açık
HTML kodu Kapalı
Trackbacks are Açık
Pingbacks are Açık
Refbacks are Açık

Benzer Konular
Konu Konuyu açana göre Forum Cevap En Son Mesaj
sqlite ve java KamilORS Java / JSP 4 08/08/2008 18:43
Eclipse'de Python Programlama Kullanımı (Harika bir IDE) Muallim-i Âli Python / Zope 11 21/03/2008 12:53
Linux Altında Java ubuntu Java / JSP 17 06/04/2007 19:29
Linux altında C++ xlegend GNU / Linux / UNIX / BSD / Pardus 5 13/07/2006 11:53
Linux Altında xD... ArkHe GNU / Linux / UNIX / BSD / Pardus 0 16/10/2002 14:18


Forum saati Türkiye saatine göredir. GMT +3. Şu anda saat 07:52.

Reklamlar & Desteklenenler
Hassas Valf | Hassas Kaplama | Antalyamız | Gazete | Ticari Bilişim | Hakan Müştak | Rüya Tabirleri | Kadın | Hastalıklar | Cepte msn ve e-posta | Webmaster | Antalya Aupair | Turkish Property Antalya | Forum | Chat | Perde | Adsl | Araba | bolindir.com | guncelle.com | livescore | Web Tasarım | evden eve nakliyat | forum | evden eve | sohbet | Resimcim| Kalifiye İnsan Kaynakları | Web Tasarım | Oyun | Yusuf KOÇ | Akın Yorulmaz | şiir | UFO | Web Tasarım | Oyunlar | Canlı Tv |


Forum Yazılımı: vBulletin Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0
Copyright ©2001 - 2008, Ceviz.net