Merhaba değerli TurkHackTeam üyeleri. Bu konumuzda SQLite3'deki Cursor işlemlerini göreceğiz.
UYARI: Lütfen bu konuyu okumadan önce Python ve SQL bildiğinizden emin olunuz.
Bu Konuda Öğrenecekleriniz:
- Cursor ile Veri Eklerken Yazılan Veri Tipleri,
- Cursor ile Veri Eklemek,
- Cursor ile Çoğul Veri Eklemek,
- Cursor'da Veri Çekiminde Kullanılan Methodlar,
- Cursor ile Veri Çekimi,
- Cursor ile Sayılı Veri Çekimi,
- Cursor'da LIKE Kullanımı,
- Cursor ile Veri Güncellemek,
- Cursor ile Veri Silmek,
- Cursor ile Table Silmek.
Öncelikle konumuza geçmeden Cursorun ne olduğunu ve ne için kullandığımızı öğrenelim isterseniz. En basit anlatımı ile cursor, veri tabanında işlem yapmamıza sağlayan araçtır. Cursor sayesinde veri tabanının içerisindeki herhangi bir veriyi değiştirebilir, çekebilir veya silebiliriz.
Cursorun ne işe' yaradığını basitçe de olsa anladığımıza göre konumuza devam edebiliriz.
Veri Tipleri
Diğer dillerin aksine, SQLite3 sadece 5 adet veri tipi barındırmaktadır. Bunlar ise aşağıda ne işe' yaradıkları ile birlikte listede bulunmakta.
- TEXT - Herhangi bir String girmek için kullanılır.
- INT - Herhangi bir INTEGER (Tam Sayı) girmek için kullanılır.
- REAL - Herhangi bir FLOAT (Ondalıklı Sayı) girmek için kullanılır.
- NULL - Boş veri girmek için kullanılır.
- BLOB - Dosya girmek için kullanılır.
Cursor ile Veri Eklemek
Madem SQLite3 öğreneceğiz, ilk yapmamız gereken şey bir veri tabanı oluşturmak ve içine veri atmak, değil mi? Hah, şimdi onu göreceğiz.
Python:
import sqlite3
bglnt = sqlite3.connect("veritabani.db") # sqlite3'deki connect attributesini kullanarak veritabanımıza bağlanıyoruz. " " içindeki dosya veritabanı dosyamız.
cursor = bglnt.cursor()
# Veritabanımıza table oluşturuyoruz. Ben örnek amaçlı 'uyeler' olarak bir table açtım.
cursor.execute("CREATE TABLE uyeler (kullaniciadi TEXT, parola TEXT)")
# Bu kodu eğer ki iki kez çalıştırırsanız hata alırsınız. Alacağınız hata da 'uyeler' tablesi zaten var olacaktır.
# Bunu düzeltmek için ya bu satırı 1 kere çalıştırdıktan sonra silin, ya da alttaki kod ile değiştirin.
# cursor.execute("CREATE TABLE IF NOT EXISTS uyeler (kullaniciadi TEXT, parola TEXT)")
# Buradaki 'IF NOT EXISTS', 'EĞER Kİ YOKSA' anlamına gelmektedir. Yani, 'uyeler' tablesi var ise
# bir daha oluşturmaya çalışmayacak.
# Veritabanına istek göndererek bilgi giriyoruz. Buradaki 'execute', 'çalıştır' anlamına geliyor.
cursor.execute("INSERT INTO uyeler VALUES ('ZiksthemW', 'Parola123')")
# Burada yaptığımız şey ise Türkçeleştirir isek şu anlama gelmektedir,
# TABLOYA YERLESTIR uyeler DEĞERLER ('ZiksthemW', 'Parola123')
bglnt.commit()
bglnt.close()
Bu kodu çalıştırdığımızda herhangi bir çıktı almayacağız fakat kod sorunsuz bir şekilde çalışacak. Siz isterseniz 'print' ekleyerek çıktı almayı sağlayabilirsiniz.
Bu kodu çalıştırdığımıza göre veri tabanımızın içi artık boş değil ve aşağıdaki gibi gözüküyor;
kullaniciadi | parola |
---|---|
ZiksthemW | Parola123 |
Cursor ile Çoğul Veri Eklemek
Bazen veri tabanına veri eklerken birden çok veri eklememiz gerekir ve tek tek yapmak ile uğraşmak istemeyiz. Bunun için 'executemany' yardıma yetişiyor. Aşağıya örneği ve açıklaması ile kodu bıraktım.
Python:
import sqlite3
bglnt = sqlite3.connect("veritabani.db")
cursor = bglnt.cursor()
# Ekleyeceğimiz kişileri bir list içine atıyoruz.
# Siz isterseniz bir siteden veri okuyarak da yapabilirsiniz bunu, ya da bir dosyadan veri okuyarak.
eklenecekUyeler = [('Tom Holland', 'TheWorstSpiderman'), ('Jack Sparrow', 'TheBestPirate')]
# Normalde cursor ile bir iş yaparken 'cursor.execute()' kullanıyoruz, değil mi?
# İşte, bu sefer 'cursor.executemany()' kullanacağız.
# Ekstra olarak ise 'executemany' kullanırken placeholder kullanmamız gerekecek.
cursor.executemany("INSERT INTO uyeler VALUES (?, ?)", eklenecekUyeler)
bglnt.commit()
bglnt.close()
Artık veri tabanımızın içinde toplamda 3 adet veri var ve veri tabanımızın içi aşağıdaki gibi gözüküyor;
kullaniciadi | parola |
---|---|
ZiksthemW | Parola123 |
Tom Holland | TheWorstSpiderman |
Jack Sparrow | TheBestPirate |
Cursor ile Veri Çekerken Kullanılan Methodlar
Veri çekerken bazen 1 tane, bazen tümünü, bazen de belirlediğiniz kadar veri çekmek isteyebilirsiniz. İşte bunun için cursorda 3 adet method bulunmakta. Bu methodları aşağıda listeledim;
- fetchall - Tüm verileri çeker.
- fetchone - Sadece son girilen veriyi çeker.
- fetchmany(1) - Parantez içine yazdığınız kadar veriyi çeker.
İşte bu kadar basit!
Cursor ile Veri Çekmek
Veri çekmek de veri eklemek kadar basit. Tek yapmanız gereken 'SELECT' ve 'FROM' kullanarak spesifik bir veriyi elde etmek.
Python:
import sqlite3
bglnt = sqlite3.connect("veritabani.db")
cursor = bglnt.cursor()
# Şimdi burada 'uyeler' tablosundan tüm verileri çekiyoruz.
# Bildiğiniz üzere '*' tümü anlamına gelmekte.
cursor.execute("SELECT * FROM uyeler")
# Ben şu anda tüm verileri çekmek istediğimden dolayı fetchall kullanacağım.
uyeler = cursor.fetchall()
# 'uyeler' değişkenini çıktılayarak veri tabanındaki bilgileri elde ediyoruz.
print(uyeler)
bglnt.commit()
bglnt.close()
Kodu benimle aynı şekilde yazdıysanız çıktınız alttaki gibi olacaktır.
[('ZiksthemW', 'Parola123'), ('Tom Holland', 'TheWorstSpiderman'), ('Jack Sparrow', 'TheBestPirate')]
Cursor ile Sayılı Veri Çekmek
Şimdi de az önce gördüğümüz 'fetchmany' attributesini göreceğiz.
Koddaki tek yapmanız gereken değişiklik 'fetchall' kısmını 'fetchmany(2)' olarak değiştirmek. Böylece 2 adet veri alacaksınız.
Python:
import sqlite3
bglnt = sqlite3.connect("veritabani.db")
cursor = bglnt.cursor()
# Şimdi burada 'uyeler' tablosundan tüm verileri çekiyoruz.
# Bildiğiniz üzere '*' tümü anlamına gelmekte.
cursor.execute("SELECT * FROM uyeler")
uyeler = cursor.fetchmany(2)
# 'uyeler' değişkenini çıktılayarak veri tabanındaki bilgileri elde ediyoruz.
print(uyeler)
bglnt.commit()
bglnt.close()
Kodun çıktısı:
[('ZiksthemW', 'Parola123'), ('Tom Holland', 'TheWorstSpiderman')]
Cursor'da LIKE Kullanımı
Açıklama, kod içinde bulunmakta.
Python:
import sqlite3
bglnt = sqlite3.connect("veritabani.db")
cursor = bglnt.cursor()
# Bu kod size birazcık karmaşık gelmiş olabilir.
# Buradaki LIKE, emin olmadığınız şeylerde kullanılabilir.
# Örnek olarak 'kullaniciadi' kısmında Z ile başlayan bir ad var,
# Fakat ne olduğunu bilmiyorsunuz. Veya Z ile başlayan tüm verileri
# Almaya çalışıyorken bu işinize yarayabilir.
cursor.execute("SELECT * FROM uyeler WHERE kullaniciadi LIKE 'Z%'")
uyeler = cursor.fetchmany(2)
print(uyeler)
bglnt.commit()
bglnt.close()
Kodun Çıktısı:
[('ZiksthemW', 'Parola123')]
Veri Güncellemek
Veri güncellemek önemli bir konu, örnek vermek gerekirse kullanıcı şifresini değiştirmek istediğinde bu şekilde değiştirecek. Önemli olduğu kadar kolay da bir konu aslında. Sadece 2 satırda verilerde oynama yapabilirsiniz. Kod aşağıda bulunmakta.
Python:
import sqlite3
bglnt = sqlite3.connect("veritabani.db")
cursor = bglnt.cursor()
# Birden fazla satır kullanacağımızdan dolayı 6 adet " işareti koymamız gerekiyor.
# Türkçeleştirilmiş hali:
# GÜNCELLE uyeler DEĞİŞTİR parola = 'Parola1234'
# HANGİSİ kullaniciadi = 'ZiksthemW'
cursor.execute("""UPDATE uyeler SET parola = 'Parola1234'
WHERE kullaniciadi = 'ZiksthemW'""")
bglnt.commit()
bglnt.close()
Bu kodu çalıştırdıktan sonra veri tabanımızın içi artık alttaki gibi gözükecek:
kullaniciadi | parola |
---|---|
ZiksthemW | Parola1234 |
Tom Holland | TheWorstSpiderman |
Jack Sparrow | TheBestPirate |
Veri Silmek
Yukarıdaki örnekten yola çıkacak olursak, kullanıcı şifresini değiştirmek yerine hesabını silmek de isteyebilir. Bundan dolayı bu da önemli bir konu. Nasıl yapıldığı aşağıda bulunmakta.
Python:
import sqlite3
bglnt = sqlite3.connect("veritabani.db")
cursor = bglnt.cursor()
# Türkçeleştirilmiş hali:
# SİL ŞURADAN uyeler NEREDEN kullaniciadi == 'ZiksthemW'
cursor.execute("DELETE FROM uyeler WHERE kullaniciadi == 'ZiksthemW'")
bglnt.commit()
bglnt.close()
Veri tabanından 'ZiksthemW'u sildik. Artık veri tabanımız alttaki gibi gözüküyor.
kullaniciadi | parola |
---|---|
Tom Holland | TheWorstSpiderman |
Jack Sparrow | TheBestPirate |
Tablo Silmek
Bu sadece bir tabloyu tamamen yok etmek istediğinizde kullanacağınızdan dolayı pek aktif kullanacağınız bir kod olmayacak büyük ihtimalle. Fakat yararlı bir kod tabii ki. Kod aşağıda bulunmakta.
Python:
import sqlite3
bglnt = sqlite3.connect("veritabani.db")
cursor = bglnt.cursor()
cursor.execute("DROP TABLE uyeler")
bglnt.commit()
bglnt.close()
Bu komutu kullandığımızda veri tabanımızdaki tablo, içindeki veriler ile birlikte sonsuza dek silinecek.
Bu konu, "Dragula - Rod Zombie" dinlenirken yazılmıştır.