- Bağlantıyı al
- X
- E-posta
- Diğer Uygulamalar
- Bağlantıyı al
- X
- E-posta
- Diğer Uygulamalar
sqlite3 Modülü ve SQL TemelleriVeritabanları, 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 Komutu | Amaç |
| CREATE TABLE | Yeni bir tablo oluşturur. |
| INSERT INTO | Tabloya yeni satır (kayıt) ekler. |
| SELECT | Tablodan veri sorgular ve çeker. |
| UPDATE | Mevcut kayıtları günceller. |
| DELETE FROM | Tablodan kayıtları siler. |
sqlite3 Modülü ile Bağlantı KurmaVeritabanı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()
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()
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()
SELECT Komutu)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()
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()
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()
| SQL Komutu | Amaç | Örnek |
| LIMIT | Sorgudan dönen satır sayısını sınırlar. | SELECT * FROM Kullanicilar LIMIT 2 (Sadece ilk 2 kaydı çeker) |
| ORDER BY | Sonuç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) |
| COUNT | Koş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) |
UPDATE ve DELETE)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()
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
Yorum Gönder