Ders-15: Python Veritabanı İşlemleri
Veritabanı ekleme, veritabanına tablo ekleme, tablodan veri okuma:
Python Veritabanı İşlemleri
Video-1 (BÖLÜM_1):
Video-2 (BÖLÜM-2):
Sqlite ile Veritabanı Programlama
Python’da veritabanı işlemleri için kullanabileceğiniz pek çok alternatif bulunur. Ama biz bütün bu alternatifler içinde Sqlite’ı tercih edeceğiz. Her şeyden önce Sqlite Python’un 2.5 sürümlerinden bu yana bu dilin bir parçasıdır. Dolayısıyla eğer kullandığınız Python sürümü 2.5 veya üstü ise Sqlite’ı Python’daki herhangi bir modül gibi içe aktarabilir ve kullanmaya başlayabilirsiniz.
Bu derste sqlite3 modülünü kullanacağız. Bu modülü programımıza:
import sqlite3
şeklinde import edeceğiz.
DB Browser for Sqlite3:
Bu programı kullanmamızın nedeni ne yaptığımızı görmektir. Bu program sayesinde veri tabanında oluşturduğumuz tabloları göreceğiz. Tabloların içerisine veri aktarımı yapıp yapmadığımızı kontrol edeceğiz. Bu programı indirmek için aşağıdaki linke tıkayabilirsiniz.
Yeni Bir Veritabanı Oluşturmak
Bu bölümde sqlite adlı bir modül aracılığıyla yeni bir veritabanını nasıl oluşturacağımızı öğreneceğiz.
Yukarıda sqlite adlı bir modülden söz ettik. Dolayısıyla, tahmin edebileceğiniz gibi, bu modülü kullanabilmek için öncelikle modülü içe aktarmamız gerekiyor. Bu bölümün başında da söylediğimiz gibi, Sqlite, Python’ın 2.5 sürümünden bu yana dilin bir parçasıdır:
>>> import sqlite3
Python’da Sqlite veritabanı sistemine ait modül ‘sqlite3’ adını taşır. Bu yüzden, bu modülü içe aktarmak için import sqlite3
ifadesini kullanmamız gerekiyor. Eğer bu isim size çok uzun geliyorsa veya modül adında sayıların ve harflerin birlikte bulunması nedeniyle hem sayı hem de harf girmeyi bir angarya olarak görüyorsanız elbette sqlite3 modülünü farklı bir adla da içe aktarabileceğinizi biliyorsunuz. Mesela:
>>> import sqlite3 as sql
Böylece sqlite3 modülünü ‘sql’ adıyla içe aktarmış olduk. Ancak ben konuyu anlatırken, okur açısından kafa karışıklığına sebep olmamak için, modülü import sqlite3
şeklinde içe aktarmışız gibi davranacağım.
Gelelim bu modül yardımıyla nasıl veritabanı oluşturulacağına… Bunun için sqlite3 modülünün connect()
adlı metodundan yararlanacağız. Bu metodu şu şekilde kullanıyoruz:
>>> vt = sqlite3.connect('veritabanı_adı')
connect()
metoduna verdiğimiz varitabanı_adı adlı argüman, kullanacağımız veritabanının adıdır. Eğer belirtilen isimde bir veritabanı sistemde bulunmuyorsa o adla yeni bir veritabanı oluşturulacaktır. Mesela:
>>> vt = sqlite3.connect('deneme.db')
Eğer bu komutu verdiğiniz dizin içinde deneme.sqlite adlı bir veritabanı yoksa, bu ada sahip bir veritabanı oluşturulacaktır.
Bu arada, biz veritabanı dosyasının uzantısı olarak .db seçtik. Veritabanı dosyasının uzantısının ne olması gerektiği konusunda kesin kurallar bulunmaz. .db uzantısının yerine, .sqlite3, .db veya .db3 gibi uzantıları tercih edenler de vardır.
Yukarıdaki örnekte deneme.sqlite adını verdiğimiz bir veritabanı dosyasına, connect()
metodu yardımıyla bağlandık. Elbette isteseydik connect()
metoduna argüman olarak tam dosya yolu da verebilirdik:
>>> import sqlite3 >>> vt = sqlite3.connect('/home/istihza/test.sqlite') #GNU/Linux >>> vt = sqlite3.connect('c:/users/fozgul/desktop/test.sqlite') #Windows
Bu komut yardımıyla sabit disk üzerinde bir Sqlite veritabanı dosyası oluşturmuş oluyoruz.
Varolan Bir Veritabanıyla Bağlantı Kurmak
Yukarıda, deneme.db adlı yeni bir Sqlite veritabanı oluşturmak için şöyle bir komut kullanmıştık:
>>> vt = sqlite3.connect('deneme.db')
Eğer bu komutu verdiğiniz dizin içinde deneme.db adlı bir veritabanı yoksa, bu ada sahip bir veritabanı oluşturulur. Eğer zaten bu adla bir veritabanı dosyanız varsa, sqlite3
bu veritabanına bağlanacaktır. Dolayısıyla Sqlite’ta hem yeni bir veritabanı oluşturmak hem de mevcut bir veritabanına bağlanmak için birbiriyle tamamen aynı kodları kullanıyoruz.
İmleç Oluşturma
Yukarıda connect()
metodunu kullanarak hem Sqlite ile nasıl veritabanı bağlantısı kuracağımızı hem de nasıl yeni bir veritabanı oluşturacağımızı öğrendik.
connect()
metodu, bir veritabanı üzerinde işlem yapabilmemizin ilk adımıdır. Veritabanını oluşturduktan veya varolan bir veritabanı ile bağlantı kurduktan sonra, veritabanı üzerinde işlem yapabilmek için sonraki adımda bir imleç oluşturmamız gerekir.
İmleç oluşturmak için cursor()
adlı bir metottan yararlanacağız:
>>> im = vt.cursor()
İmleci oluşturduktan sonra artık önümüz iyice açılıyor. Böylece, yukarıda oluşturduğumuz im
nesnesinin execute()
metodunu kullanarak SQL komutlarını çalıştırabileceğiz. Nasıl mı? Hemen bakalım.
Tablo Oluşturma
Önceki bölümün sonunda söylediğimiz gibi, bir imleç nesnesi oluşturduktan sonra bunun execute()
metodunu kullanarak SQL komutlarını işletebiliyoruz. Dilerseniz şimdi basit bir örnek yaparak neyin ne olduğunu anlamaya çalışalım. Öncelikle gerekli modülü içe aktaralım:
>>> import sqlite3
Şimdi de yeni bir veritabanı dosyası oluşturalım (veya varolan bir veritabanı dosyasına bağlanalım):
>>> vt = sqlite3.connect('veritabani.db')
Bu veritabanı üzerinde işlem yapabilmek için öncelikle imlecimizi oluşturalım:
>>> im = vt.cursor()
Şimdi de yukarıda oluşturduğumuz imlecin execute()
adlı metodunu kullanarak veritabanı içinde bir tablo oluşturalım:
>>> im.execute("CREATE TABLE adres_defteri (isim, soyisim)")
Hatırlarsanız, Sqlite veritabanı sisteminin tablo benzeri bir yapıya sahip olduğunu ve bu sistemdeki her tablonun da bir isminin bulunduğunu söylemiştik. İşte burada yaptığımız şey, ‘adres_defteri’ adlı bir tablo oluşturup, bu tabloya ‘isim’ ve ‘soyisim’ adlı iki sütun eklemekten ibarettir. Yani aslında şöyle bir şey oluşturmuş oluyoruz:
isim | soyisim |
---|---|
Ayrıca oluşturduğumuz bu tablonun adının da ‘adres_defteri’ olduğunu unutmuyoruz…
Bu işlemleri nasıl yaptığımıza dikkat edin. Burada CREATE TABLE adres_defteri (isim, soyisim)
tek bir karakter dizisidir. Bu karakter dizisindeki CREATE TABLE
kısmı bir SQL komutu olup, bu komut bir tablo oluşturulmasını sağlar.
Burada CREATE TABLE
ifadesini büyük harflerle yazdık. Ancak bu ifadeyi siz isterseniz küçük harflerle de yazabilirsiniz. Benim burada büyük harf kullanmaktaki amacım SQL komutlarının, ‘adres_defteri’, ‘isim’ ve ‘soyisim’ gibi öğelerden görsel olarak ayırt edilebilmesini sağlamak. Yani CREATE TABLE
ifadesinin mesela ‘adres_defteri’ öğesinden kolayca ayırt edilebilmesini istediğim için burada CREATE TABLE
ifadesini büyük harflerle yazdım.
Karakter dizisinin devamında (isim, soyisim)
ifadesini görüyoruz. Tahmin edebileceğiniz gibi, bunlar tablodaki sütun başlıklarının adını gösteriyor. Buna göre, oluşturduğumuz tabloda ‘isim’ ve ‘soyisim’ adlı iki farklı sütun başlığı olacak.
Bu arada, Sqlite tabloları oluştururken tablo adı ve sütun başlıklarında Türkçe karakter kullanmaktan kaçınmak iyi bir fikirdir. Ayrıca eğer tablo adı ve sütun başlıklarında birden fazla kelimeden oluşan etiketler kullanacaksanız bunları ya birbirine bitiştirin ya da tırnak içine alın. Örneğin:
import sqlite3 vt = sqlite3.connect('perso.db') im = vt.cursor() im.execute("""CREATE TABLE 'personel dosyasi' ('personel ismi', 'personel soyismi', memleket)""")
Ayrıca, execute()
metoduna parametre olarak verilen SQL komutlarının alelade birer karakter dizisi olduğuna da dikkatinizi çekmek isterim. Bunlar Python’daki karakter dizilerinin bütün özelliklerini taşır. Mesela bu karakter dizisini execute()
metoduna göndermeden önce bir değişkene atayabilirsiniz:
import sqlite3 vt = sqlite3.connect('perso.db') im = vt.cursor() sql = """CREATE TABLE 'personel dosyasi' ('personel ismi', 'personel soyismi', memleket)""" im.execute(sql)
Bu kodları kullanarak oluşturduğunuz perso.db adlı veritabanı dosyasının içeriğini DB Browser for Sqlite programı yardımıyla görüntüleyip, gerçekten ‘personel ismi’, ‘personel soyismi’ ve ‘memleket’ sütunlarının oluşup oluşmadığını kontrol edin.
Bu arada, bu kodları ikinci kez çalıştırdığınızda şöyle bir hata mesajı alacaksınız:
sqlite3.OperationalError: table 'personel dosyasi' already exists
Bu hata mesajını almanız gayet normal. Bunun üstesinden nasıl geleceğinizi öğrenmek için okumaya devam edin…
Tabloya Veri Girme
Buraya kadar, sqlite3 modülünü kullanarak nasıl bir veritabanı oluşturacağımızı ve çeşitli sütünlardan oluşan bir tabloyu bu veritabanına nasıl yerleştireceğimizi öğrendik. Şimdi de oluşturduğumuz bu sütun başlıklarının altını dolduracağız.
import sqlite3 vt = sqlite3.connect('vt.db') im = vt.cursor() tablo_yap = """CREATE TABLE IF NOT EXISTS personel (isim, soyisim, memleket)""" değer_gir = """INSERT INTO personel VALUES ('Fırat', 'Özgül', 'Adana')""" im.execute(tablo_yap) im.execute(değer_gir)
Burada INSERT INTO tablo_adı VALUES
adlı yeni bir SQL komutu daha öğreniyoruz. CREATE TABLE
ifadesi Türkçe’de “TABLO OLUŞTUR” anlamına geliyor. INSERT INTO
ise “… İÇİNE YERLEŞTİR” anlamına gelir. Yukarıdaki karakter dizisi içinde görünen VALUES
ise “DEĞERLER” demektir. Yani aslında yukarıdaki karakter dizisi şu anlama gelir: “personel İÇİNE ‘Fırat’, ‘Özgül’ ve ‘Adana’ DEĞERLERİNİ YERLEŞTİR. Yani şöyle bir tablo oluştur”:
isim | soyisim | memleket |
---|---|---|
Fırat | Özgül | Adana |
Verilerin Veritabanına İşlenmesi
Bir önceki bölümde bir Sqlite veritabanına nasıl veri gireceğimizi öğrendik. Ama aslında iş sadece veri girmeyle bitmiyor. Verileri veritabanına “işleyebilmek” için bir adım daha atmamız gerekiyor. Mesela şu örneğe bir bakalım:
import sqlite3 vt = sqlite3.connect("vt.db") im = vt.cursor() im.execute("""CREATE TABLE IF NOT EXISTS personel (isim, soyisim, sehir, eposta)""") im.execute("""INSERT INTO personel VALUES ("Orçun", "Kunek", "Adana", "[email protected]")""")
Burada öncelikle vt.sqlite adlı bir veritabanı oluşturduk ve bu veritabanına bağlandık. Ardından, vt.cursor()
komutuyla imlecimizi de oluşturduktan sonra, SQL komutlarımızı çalıştırıyoruz. Önce isim, soyisim, şehir ve eposta adlı sütunlardan oluşan, “personel” adlı bir tablo oluşturduk. Daha sonra “personel” tablosunun içine “Orçun”, “Kunek”, “Adana” ve “[email protected]” değerlerini yerleştirdik.
Ancak her ne kadar veritabanına veri işlemiş gibi görünsek de aslında henüz işlenmiş bir şey yoktur. İsterseniz bu durumu teyit etmek için Sqlitebrowser programını kullanabilir, tabloya verilerin işlenmediğini kendi gözlerinizle görebilirsiniz.
Biz henüz sadece verileri girdik. Ama verileri veritabanına işlemedik. Bu girdiğimiz verileri veritabanına işleyebilmek için commit()
adlı bir metottan yararlanacağız:
>>> vt.commit()
Gördüğünüz gibi, commit()
imlecin değil, bağlantı nesnesinin (yani burada vt
değişkeninin) bir metodudur. Şimdi bu satırı da betiğimize ekleyelim:
import sqlite3 vt = sqlite3.connect("vt.db") im = vt.cursor() im.execute("""CREATE TABLE IF NOT EXISTS personel (isim, soyisim, sehir, eposta)""") im.execute("""INSERT INTO personel VALUES ("Orçun", "Kunek", "Adana", "[email protected]")""") vt.commit()
Bu son satırı da ekledikten sonra Sqlite veritabanı içinde şöyle bir tablo oluşturmuş olduk:
isim | soyisim | şehir | eposta |
---|---|---|---|
Orçun | Kunek | Adana | [email protected] |
Eğer vt.commit()
satırını yazmazsak, veritabanı, tablo ve sütun başlıkları oluşturulur, ama sütunların içeriği veritabanına işlenmez.
Veritabanının Kapatılması
Bir veritabanı üzerinde yapacağımız bütün işlemleri tamamladıktan sonra, prensip olarak, o veritabanını kapatmamız gerekir. Mesela şu kodları ele alalım:
import sqlite3 vt = sqlite3.connect("vt.db") im = vt.cursor() im.execute("""CREATE TABLE IF NOT EXISTS personel (isim, soyisim, sehir, eposta)""") im.execute("""INSERT INTO personel VALUES ("Orçun", "Kunek", "Adana", "[email protected]")""") vt.commit() vt.close()
Burada bütün işlemleri bitirdikten sonra veritabanını kapatmak için, close()
adlı bir metottan yararlandık:
vt.close()
Bu şekilde, veritabanının ilk açıldığı andan itibaren, işletim sisteminin devreye soktuğu kaynakları serbest bırakmış oluyoruz. Esasında programımız kapandığında, açık olan bütün Sqlite veritabanları da otomatik olarak kapanır. Ama yine de bu işlemi elle yapmak her zaman iyi bir fikirdir.
Eğer üzerinde işlem yaptığınız veritabanının her şey bittikten sonra otomatik olarak kapanmasını garantilemek isterseniz, daha önce öğrendiğimiz with sözcüğünü kullanabilirsiniz:
import sqlite3 with sqlite3.connect('vt.db') as vt: im = vt.cursor() im.execute("""CREATE TABLE IF NOT EXISTS personel (isim, soyisim, memleket)""") im.execute("""INSERT INTO personel VALUES ('Fırat', 'Özgül', 'Adana')""") vt.commit()
Bu şekilde with sözcüğünü kullanarak bir veritabanı bağlantısı açtığımızda, bütün işler bittikten sonra Python bizim için bağlantıyı otomatik olarak sonlandıracaktır.