Python, SQLite3'de Cursor İşlemleri.

ZiksthemW

Uzman üye
28 Mar 2020
1,026
113
Oslo
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.
  1. TEXT - Herhangi bir String girmek için kullanılır.
  2. INT - Herhangi bir INTEGER (Tam Sayı) girmek için kullanılır.
  3. REAL - Herhangi bir FLOAT (Ondalıklı Sayı) girmek için kullanılır.
  4. NULL - Boş veri girmek için kullanılır.
  5. 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;


kullaniciadiparola
ZiksthemWParola123



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;

kullaniciadiparola
ZiksthemWParola123
Tom HollandTheWorstSpiderman
Jack SparrowTheBestPirate



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;

  1. fetchall - Tüm verileri çeker.
  2. fetchone - Sadece son girilen veriyi çeker.
  3. 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:

kullaniciadiparola
ZiksthemWParola1234
Tom HollandTheWorstSpiderman
Jack SparrowTheBestPirate



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.

kullaniciadiparola
Tom HollandTheWorstSpiderman
Jack SparrowTheBestPirate


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.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.