Resim

Python sqlite3

Python sqlite3 Modülü ve SQL Temelleri

1. SQL ve Veritabanı Kavramları

Veritabanları, verileri tablolar halinde düzenler. Bir tablo, satır ve sütunlardan oluşur. Python'da veritabanı ile etkileşim kurmak için SQL (Structured Query Language) dilini kullanırız.

SQL KomutuAmaç
CREATE TABLEYeni bir tablo oluşturur.
INSERT INTOTabloya yeni satır (kayıt) ekler.
SELECTTablodan veri sorgular ve çeker.
UPDATEMevcut kayıtları günceller.
DELETE FROMTablodan kayıtları siler.

2. sqlite3 Modülü ile Bağlantı Kurma

Veritabanıyla çalışmak için atılacak ilk adım, modülü içeri aktarmak ve veritabanı dosyasına bir bağlantı kurmaktır.

import sqlite3
import os # Veritabanı dosyasını kontrol etmek için

# 1. Bağlantı Kurma
# 'ornek_db.sqlite' adında bir dosya yoksa, oluşturulur.
# Eğer 'database/:memory:' kullanırsanız, veritabanı 
#bellekte (RAM) oluşturulur ve Python kapanınca silinir.
baglanti = sqlite3.connect('ornek_db.sqlite')

# 2. İşlemleri Yürütecek İmleç (Cursor) Oluşturma
# Tüm SQL komutları imleç üzerinden çalıştırılır.
imlec = baglanti.cursor()

print("Veritabanı bağlantısı başarıyla kuruldu ve imleç oluşturuldu.")
# NOT: İşlem bitince kapatmayı unutmayın! baglanti.close()

3. Tablo Oluşturma (CREATE TABLE)

Bir veritabanındaki verilerimizi tutacak bir tablo oluşturmalıyız.

import sqlite3

baglanti = sqlite3.connect('ornek_db.sqlite')
imlec = baglanti.cursor()

# SQL komutunu yazıyoruz (Büyük harfle yazmak sadece yaygın 
# bir kuraldır)
# IF NOT EXISTS: Tablo zaten varsa hata vermesini önler.
# id INTEGER PRIMARY KEY: Benzersiz bir anahtar sütun oluşturur.
imlec.execute("""
CREATE TABLE IF NOT EXISTS Kullanicilar (
    id INTEGER PRIMARY KEY,
    isim TEXT NOT NULL,
    email TEXT UNIQUE,
    yas INTEGER
)
""")

# Değişiklikleri veritabanı dosyasına kaydetme (KRİTİK ADIM!)
baglanti.commit() 
print("Kullanicilar tablosu başarıyla oluşturuldu.")
baglanti.close()

4. Veri Ekleme (INSERT INTO)

Veri eklerken, SQL enjeksiyonu gibi güvenlik açıklarını önlemek için asla f-string veya dize birleştirme kullanmamalıyız. Bunun yerine, SQL sorgusunda ? (yer tutucu) kullanırız.

import sqlite3

baglanti = sqlite3.connect('ornek_db.sqlite')
imlec = baglanti.cursor()

# 1. Tek Kayıt Ekleme
kisi_bilgisi = ("Ahmet Yılmaz", "ahmet@mail.com", 30)
imlec.execute("INSERT INTO Kullanicilar (isim, email, yas) 
                    VALUES (?, ?, ?)", kisi_bilgisi)
baglanti.commit()
print("Tek kayıt başarıyla eklendi.")


# 2. Birden Fazla Kayıt Ekleme (executemany)
yeni_kullanicilar = [
    ("Ayşe Demir", "ayse@mail.com", 24),
    ("Mehmet Can", "mehmet@mail.com", 45),
    ("Elif Kaya", "elif@mail.com", 19)
]
# executemany, listeyi tek tek döngüye almadan toplu ekleme yapar 
# (Daha Hızlı)
imlec.executemany("INSERT INTO Kullanicilar (isim, email, yas) 
                         VALUES (?, ?, ?)", yeni_kullanicilar)
baglanti.commit()
print(f"{len(yeni_kullanicilar)} kayıt toplu olarak eklendi.")
baglanti.close()

5. Veri Çekme (SELECT Komutu)

A. Tüm Veriyi Çekme (SELECT * ve fetchall())

Bir tablodaki tüm sütunları ve tüm satırları çekmek için kullanılır.

import sqlite3

baglanti = sqlite3.connect('ornek_db.sqlite')
imlec = baglanti.cursor()

# 1. SQL Sorgusunu Çalıştırma
# * işareti, tablodaki TÜM sütunları seç demektir.
imlec.execute("SELECT * FROM Kullanicilar")

# 2. Tüm Sonuçları Alma
# fetchall(): Sorgunun döndürdüğü tüm satırları bir liste (list) 
# olarak döndürür.
# Her satır, bir tuple (demet) olarak listeye eklenir.
tum_kullanicilar = imlec.fetchall()

print("--- Tüm Kullanıcılar (fetchall) ---")
for kullanici in tum_kullanicilar:
    print(kullanici)

# Örnek Çıktı:
# (1, 'Ahmet Yılmaz', 'ahmet@mail.com', 30)
# (2, 'Ayşe Demir', 'ayse@mail.com', 24)
# (3, 'Mehmet Can', 'mehmet@mail.com', 45)
# (4, 'Elif Kaya', 'elif@mail.com', 19)
baglanti.close()

B. Tek Bir Kayıt Çekme (fetchone())

Sorgunun döndürdüğü ilk kaydı çeker. Genellikle id gibi benzersiz bir değere göre arama yapıldığında kullanılır.

import sqlite3

baglanti = sqlite3.connect('ornek_db.sqlite')
imlec = baglanti.cursor()

# Sadece 3. ID'ye sahip kullanıcıyı seç
imlec.execute("SELECT * FROM Kullanicilar WHERE id = 3")

# fetchone(): Sadece ilk satırı (tuple olarak) döndürür.
tek_kullanici = imlec.fetchone()

print("\n--- Tek Kullanıcı (fetchone) ---")
if tek_kullanici:
    print(f"ID: {tek_kullanici[0]}, İsim: {tek_kullanici[1]}, 
            Yaş: {tek_kullanici[3]}")
else:
    print("Kullanıcı bulunamadı.")
baglanti.close()

C. Koşullu Veri Çekme (WHERE ve Yer Tutucular)

Belirli kriterlere uyan kayıtları çekmek için WHERE koşulunu kullanırız. Güvenlik için yine ? yer tutucuları kullanmak zorunludur.

import sqlite3

baglanti = sqlite3.connect('ornek_db.sqlite')
imlec = baglanti.cursor()

aranan_yas = 24
aranan_email_sonu = "@mail.com"

# 1. Yaşa Göre Sorgulama
imlec.execute("SELECT isim, yas FROM Kullanicilar WHERE yas > ?",
               (aranan_yas,)) 
# Not: Tek bir değer gönderirken bile Python tuple beklediği için 
sonuna virgül (,) koyduk!
yeni_sonuclar = imlec.fetchall()
print(f"\n--- Yaşı {aranan_yas}'ten Büyük Olanlar ---")
for satir in yeni_sonuclar:
    print(f"İsim: {satir[0]}, Yaş: {satir[1]}")
baglanti.close()

D. Ek Seçim Komutları

SQL KomutuAmaçÖrnek
LIMITSorgudan dönen satır sayısını sınırlar.SELECT * FROM Kullanicilar LIMIT 2 (Sadece ilk 2 kaydı çeker)
ORDER BYSonuçları belirli bir sütuna göre sıralar.SELECT * FROM Kullanicilar ORDER BY yas DESC (Yaşa göre büyükten küçüğe sıralar)
COUNTKoşula uyan satır sayısını döndürür.SELECT COUNT(id) FROM Kullanicilar WHERE yas < 40 (Yaşı 40'tan küçük olanların sayısını verir)

6. Veri Güncelleme ve Silme (UPDATE ve DELETE)

A. Veri Güncelleme (UPDATE)

UPDATE komutu, bir veya daha fazla kaydın sütun değerlerini değiştirmek için kullanılır.

Söz Dizimi: UPDATE [TabloAdı] SET [Sütun] = [YeniDeğer] WHERE [Koşul]

import sqlite3

baglanti = sqlite3.connect('ornek_db.sqlite')
imlec = baglanti.cursor()

# Senaryo: Mehmet Can'ın yaşının yanlış girildiğini varsayalım 
#(45 yerine 48 olmalı).
yeni_yas = 48
kullanici_email = "mehmet@mail.com"

# SQL Komutu: email'i 'mehmet@mail.com' olan kaydın 'yas' 
# sütununu 48 yap.
imlec.execute(
    "UPDATE Kullanicilar SET yas = ? WHERE email = ?", 
    (yeni_yas, kullanici_email)
)
# Değişiklikleri veritabanına kaydetmek ZORUNLUDUR!
baglanti.commit() 
print(f"Kayıt güncellendi. {imlec.rowcount} satır etkilendi.")

# Güncelleme sonrası kontrol
imlec.execute("SELECT isim, yas FROM Kullanicilar WHERE email = ?", 
               (kullanici_email,))
print(f"Yeni Durum: {imlec.fetchone()}") # Çıktı: ('Mehmet Can', 48)
baglanti.close()

B. Veri Silme (DELETE FROM)

DELETE FROM komutu, tabloda belirtilen koşula uyan bir veya daha fazla kaydı silmek için kullanılır.

Söz Dizimi: DELETE FROM [TabloAdı] WHERE [Koşul]

import sqlite3

baglanti = sqlite3.connect('ornek_db.sqlite')
imlec = baglanti.cursor()

# Senaryo: Yaşı 20'den küçük olan Elif Kaya kaydını silelim.
silinecek_isim = "Elif Kaya"

# SQL Komutu: ismi 'Elif Kaya' olan tüm kayıtları sil.
imlec.execute(
    "DELETE FROM Kullanicilar WHERE isim = ?", 
    (silinecek_isim,) # Tek elemanlı tuple'ı unutmayın
)

# Değişiklikleri veritabanına kaydetmek ZORUNLUDUR!
baglanti.commit()
print(f"Kayıt silindi. {imlec.rowcount} satır silindi.")

# Silme sonrası kontrol
imlec.execute("SELECT * FROM Kullanicilar WHERE isim = ?", 
                (silinecek_isim,))
print(f"Silinen Kullanıcı Durumu: {imlec.fetchone()}") 
# Çıktı: None (Silindiği için)
# KRİTİK UYARI: WHERE koşulu OLMADAN DELETE çalıştırılırsa, 
# TABLODAKİ TÜM KAYITLAR silinir.
# imlec.execute("DELETE FROM Kullanicilar")# DİKKAT! Tüm kullanıcıları siler.
baglanti.close()

Yorumlar

Bu blogdaki popüler yayınlar

Python random Modülü

Python print()

Yazılım Nedir?