# Python SQLite Veritabanı

Python Sqlite veritabanı işlemlerini öğreniyoruz.

SQLite, hafif ve disk tabanlı bir veritabanı çözümüdür. Herhangi bir ayrı sunucu işlemine gerek kalmadan ve basit standart sql söz dizimi ile cihazların yerel hafızalarında bile kullanılabilir. Birçok dil ile kullanımı olduğu gibi Python ile de rahatlıkla entegre dilebilir.

1. SQLite Avantajları

  • Bir modül olarak projenize rahatlıkla dahil edebilirsiniz

  • Ayrı bir yazılım veya sunucu kurmanıza gerek yoktur.

  • Veritabanını diskinizde saklayabilirsiniz ve kolaylıkla transfer edebilirsiniz.

  • Söz dizimi oldukça basittir, rahat öğrenilebilir.

  • Açık kaynak kodludur, istediğiniz düzenlemeleri yapabilirsiniz.

SQLite her ne kadar basit bir veritabanı gibi gözüksede oldukça güçlü bir veritabanıdır ve kullanımı yaygındır.

2. Veritabanı İşlemleri

Python ile SQLite veritabanı üzerinde yapacağımız işlemleri bu başlık altında sırasıyla işleyeceğiz. Fakat öncesinde sqlite3 modülünü projenize dahil etmelisiniz.

import sqlite3

Ardından işlemlerimize geçebiliriz.

2.1 Veritabanı Oluşturma

İlk olarak yeni bir veritabanı oluşturmak veya mevcut bir veritabanına bağlanmak için connect() fonksiyonunu kullanmalıyız. Bağlanacağımız veritabanı mevcut değilse otomatik olarak oluşturulacaktır.

db = sqlite3.connect('veritabanı_adı.db')

SQLite veritabanı uzantısı herhangi bir terim olabilir. Genel olarak db, db3, sqlite ve sqlite3 kullanılır ama siz başka bir isimde seçebilirsiniz. (Örneğin veritabani.elma)

Eğer isterseniz veritabanını tam adres göstererek de oluşturabilirsiniz.

db = sqlite3.connect('/home/kerteriz/test.sqlite') #GNU/Linux
db = sqlite3.connect('c:/users/kerteriz/desktop/test.sqlite') #Windows

Aynı şekilde RAM veya sabit disk üzerinde geçici bir veritabanı da oluşturabilirsiniz.

db = sqlite3.connect(':memory:') # RAM üzerinde geçici db
db = sqlite3.connect('') # HDD üzerinde geçici db

Daha çok test ortamları için kullanılan geçici veritabanları program sonlandırıldığında veya veritabanı bağlantısı kapatıldığında silinecektir.

2.2 İmleç Oluşturma

Yeni oluşturduğumuz veya mevcut olan bir veritabanına bağlandıktan sonra üzerinde işlem yapabilmek için cursor() fonksiyonu ile imleç oluşturmamız gerekiyor.

imlec = db.cursor()

2.3 Yeni Tablo Oluşturma

SQL komutlarını oluşturabilmek için imlecimizle beraber execute() fonksiyonunu kullanmalıyız. Böylelikle tüm SQL komutlarını veritabanımız üzerinde çalıştırabiliriz.

imlec.execute("CREATE TABLE ogrenciler(isim, yas)")

Artık veritabanımızda ogrenciler isimli ve iki sütunlu (isim,yas) bir tablo oluşturmuş olduk. Daha uzun komutlarınızı daha rahat okuyabilmek için """ işareti ile birden fazla satırda kullanabilirsiniz.

imlec.execute(""""CREATE TABLE ogrenciler
(isim, yas, sinif, veli, telefon, email)""")

Ayrıca daha rahat bir kullanım için sql komutlarınızı bir değişkene atayarak execute() fonksiyonuna da gönderebilirsiniz.

komut = "CREATE TABLE ogrenciler(isim, yas)"
imlec.execute(komut)

Yukarıdaki yöntemlerle tablo oluşturduğunuzda tekrar aynı komutu çalıştırırsanız zaten bir kere oluşturulduğu için "sqlite3.OperationalError: table ogrenciler already exists" hatası verecektir.

Uyarıda ki hatayı engellemek için tablo oluşturma komutunu IF NOT EXISTS ile güncelleyiniz. Böylece tablo zaten mevcutsa tekrardan oluşturulmaya çalışılmayacaktır.

komut = "CREATE TABLE IF NOT EXISTS ogrenciler(isim, yas)"
imlec.execute(komut)

2.4 ~INSERT~ ile Yeni Satır Ekleme

Tablomuza yeni veriler girebilmek için sql INSERT komutunu kullanmalıyız.

komut = """INSERT INTO ogrenciler VALUES ('Yunus', 25)"""
imlec.execute(komut)

Aynı mantıkla komutumuzu yazdık ve imleç ile veritabanına işlettik. Fakat veritabanımızı kontrol ettiğinizde yeni verilerin eklenmemiş olduğunu göreceksiniz. Eğer yapılan değişikliklerin veritabanına uygulanmasını istiyorsanız commit() fonksiyonunu çalıştırmanız gerekiyor.

db.commit()

Artık yeni verileri tablonuzda görebilirsiniz.

2.5 ~SELECT~ ile Tablodaki Verileri Seçmek

Tablomuza örnek veriler ekledikten sonra bu verileri seçmek için SELECT komutunu kullanırız.

isim

yas

Yunus

24

Ahmet

30

Deniz

15

Örnek tablomuzdaki tüm verileri çekmek için öncelikle sql komutumuzu çalıştıralım ve ardından fetchall() fonksiyonu ile tüm verileri değişkenimize atalım. Ardından tüm verilerimiz demet halinde dönecektir.

komut = """SELECT * FROM ogrenciler"""
imlec.execute(komut)
veriler = imlec.fetchall()
print(veriler) # [('Yunus', 25), ('Ahmet', 30), ('Deniz', 15)]

Tüm satırları çekmek istediğimizde for terimini de kullanabiliriz.

komut = """SELECT * FROM ogrenciler"""
imlec.execute(komut)
for veri in imlec:
print(veri)
# ('Yunus', 25)
# ('Ahmet', 30)
# ('Deniz', 15)

Eğer tek tek satır çekmek istiyorsanız bu sefer fetchone() fonksiyonunu kullanmalısınız. fetchone() fonksiyonu her çalıştığında sıradaki satırı çeker.

komut = """SELECT * FROM ogrenciler"""
imlec.execute(komut)
print(imlec.fetchone()) # ('Yunus', 25)
print(imlec.fetchone()) # ('Ahmet', 30)
print(imlec.fetchone()) # ('Deniz', 15)

Çektiğiniz tek bir satırın sütunlarına ulaşmak için demet elemanlarını kullanabiliriz.

komut = """SELECT * FROM ogrenciler WHERE yas = {}""".format(15)
imlec.execute(komut)
veri = imlec.fetchone()
print("İsim: " + str(veri[0])) # İsim: Deniz
print("Yaş: " + str(veri[1])) # Yaş: 15

Tümünü veya tekini çekmek yerine belirlediğiniz adette satır çekmek için fetchmany() fonksiyonunu kullanabilirsiniz.

komut = """SELECT * FROM ogrenciler"""
imlec.execute(komut)
veriler = imlec.fetchmany(2)
print(veriler) # [('Yunus', 25), ('Ahmet', 30)]

Adet sayısınca çekeceğiniz veriler üzerinde fetchone() fonksiyonu ile gezerken for döngüsünü de kullanabiliriz.

komut = """SELECT * FROM ogrenciler"""
imlec.execute(komut)
for veri in range(2):
print(imlec.fetchone())
# ('Yunus', 25)
# ('Ahmet', 30)

2.6 ~UPDATE~ ile Veri Güncelleme

Elimizdeki tabloda yer alan veriler üzerinde bir güncelleme yapmak istediğimizde UPDATE sql komutunu kullanırız. Örnek verirsek elimizde aşağıdaki gibi bir tablo olduğunu farzedelim.

isim

yas

Yunus

25

Özlem

15

Ahmet

30

Örnek tablomuz üzerindeki Ahmet isimli kullanıcının yaşını 50 olarak güncelleyelim.

komut = "UPDATE ogrenciler SET yas = ? WHERE isim = ?"
imlec.execute(komut,(50,'Ahmet'))
db.commit()

Verileri ? ile işaretleyip verileri demet halinde execute() fonksiyonuna vermemizin ardından hemen sonucu kontrol edelim.

komut = """SELECT * FROM ogrenciler"""
imlec.execute(komut)
veri = imlec.fetchall()
print(veri) # [('Yunus', 25), ('Özlem', 15), ('Ahmet', 50)]

2.7 ~DELETE~ ile Veri Silme

Tablomuz üzerindeki bir veriyi silmek için DELETE sql komutunu kullanmalıyız. Örnek olarak aynı tablo üzerinde yer alan Yunus kullanıcısını silelim.

komut = "DELETE FROM ogrenciler WHERE isim = ?"
imlec.execute(komut,('Yunus',))
db.commit()

Tek elemanlı bir demet kullandığımız için elemandan sonra virgül koyuyoruz ve Yunus isimli satırı silmek istediğimizi söylüyoruz. Ardından sonucumuz şu şekilde oluyor.

komut = """SELECT * FROM ogrenciler"""
imlec.execute(komut)
veri = imlec.fetchall()
print(veri) # [('Özlem', 15), ('Ahmet', 50)]

2.8 Veritabanı Bağlantısını Kapatmak

Veritabanı üzerindeki işlerinizi tamamladığınızda veritabanı bağlantısını sonlandırmak için close() fonksiyonunu kullanmalısınız.

db.close()

3. SQLite Browser Kullanımı

SQLite Browser, elinizdeki veritabanı üzerindeki çalışmalarınızı bir arayüz üzerinden yapmanızı sağlar. Basit ve kullanışlı arayüzü ile tüm veritabanı işlemlerinizi rahatlıkla yapabilirsiniz.

Sqlite Browser programının arayüzü

SQLite Browser programını indirmek için tıklayınız.

4. Özet

Tüm işlemleri kısaca özetlersek sırasıyla şu işlemleri yapmalısınız.

  1. sqlite3 modülünü projenize dahil edin

  2. Mevcut veya yeni veritabanınızı connect() fonksiyonu ile bağlayın

  3. cursor() fonksiyonu ile imleç oluşturun

  4. Sql komutlarınızı execute() fonksiyonu ile işletin.

  5. Veritabanınızda değişiklik olacaksa commit() edin.

  6. Veritabanı bağlantınızı close() ile sonlandırın.