Yazılım geliştirme sürecinde, kullanıcılardan aldığınız verilerin veya programınızın ürettiği sonuçların kalıcı olarak saklanması gerekir. Geçici bellekteki (RAM) veriler program kapatıldığında silinirken, veritabanları (databases) bilgileri diskinizde kalıcı olarak tutar. Python programlama dilinde veritabanı dünyasına adım atmak isteyen yeni başlayanlar için en iyi ve en pratik seçenek SQLite‘tır.
Bu rehberimizde, Python’un sunduğu yerleşik kütüphaneyi kullanarak SQLite veritabanı işlemlerini nasıl gerçekleştireceğinizi tüm detaylarıyla öğreneceksiniz.
1. SQLite Nedir ve Python ile Neden Kullanılmalıdır?
SQLite, karmaşık bir veritabanı sunucusu kurulumuna veya ayrı bir arka plan sürecine (server process) ihtiyaç duymadan, doğrudan disk üzerinde hafif bir veritabanı dosyası oluşturan bir C kütüphanesidir. Python 2.5x sürümlerinden bu yana sqlite3 modülü Python’un standart kütüphanesinin (dahili olarak) bir parçası olarak gelmektedir. Bu nedenle, geliştirme ortamınıza harici bir paket kurmanıza gerek kalmaz.
Python’daki bu modül, DB-API 2.0 spesifikasyonu ile uyumlu, standartlaştırılmış, oldukça anlaşılır ve kullanımı kolay bir arayüz sağlar. Projelerinizin prototipini oluştururken SQLite ile başlamak çok avantajlıdır. İleride PostgreSQL veya Oracle gibi devasa sunucu tabanlı veritabanlarına uygulamanızı taşımak isterseniz, yazdığınız standart SQL sorguları sayesinde bu geçiş işlemi oldukça kolay olacaktır.
2. SQLite Veri Tipleri ve Python Karşılıkları
Veritabanına veri kaydederken SQLite’ın anladığı dilden konuşmak önemlidir. SQLite yerel olarak beş temel veri tipini destekler: NULL (Yokluk), INTEGER (Tam sayı), REAL (Ondalıklı sayı), TEXT (Metin) ve BLOB (İkili veri – Resim veya doküman gibi).
Python’daki standart veri tiplerinin SQLite karşılıkları sistem tarafından otomatik olarak çevrilir:
NonetipiNULLdeğerine,int(Tam sayı) tipiINTEGERdeğerine,float(Ondalıklı) tipiREALdeğerine,str(Metin dizisi) tipiTEXTdeğerine,bytestipi ise doğrudanBLOBdeğerine dönüştürülür.
Bu yapı sayesinde, Python kodunuzu yazarken veritabanına özel karmaşık dönüşümlerle uğraşmak zorunda kalmazsınız.
3. Kütüphaneyi İçe Aktarma ve Bağlantı (Connection) Kurma
Veritabanı işlemlerine başlamak için ilk adım kütüphaneyi içeri aktarmak ve bir veritabanı bağlantısı açmaktır. sqlite3.connect() fonksiyonu, parantez içinde belirttiğiniz veritabanı dosyasına bir bağlantı sağlar. Eğer bilgisayarınızda belirttiğiniz isimde bir dosya yoksa programınız çökmez; SQLite bu dosyayı bulunduğunuz dizinde anında oluşturur.
Dilerseniz "dosya_adi.db" yerine ":memory:" parametresini kullanarak diske kaydedilmeyen, sadece RAM (bellek) üzerinde yaşayan ve program kapanınca kaybolan çok hızlı, geçici bir veritabanı da oluşturabilirsiniz.
import sqlite3
# tutorial.db adlı veritabanına bağlanıyoruz
con = sqlite3.connect("tutorial.db")
print("Veritabanı bağlantısı başarıyla kuruldu!")
4. İmleç (Cursor) Oluşturma ve Tablo Yaratma
Bağlantıyı kurduk, ancak veritabanına SQL sorguları göndermek (execute) ve sonuçları geri çekmek (fetch) için bir İmleç (Cursor) nesnesine ihtiyacımız vardır. İmleci, veritabanı üzerinde işlem yapan sanal bir fare veya klavye gibi düşünebilirsiniz. con.cursor() komutunu çağırarak bu imleci yaratırız.
Şimdi filmlerin başlığını, çıkış yılını ve inceleme puanını saklamak için “film” isminde yeni bir tablo oluşturalım. SQLite’ın esnek tipleme (flexible typing) özelliği sayesinde veri tiplerini belirtmek zorunlu olmasa da, kodun temizliği için sütun tiplerini (TEXT, INTEGER, REAL) açıkça yazmak tavsiye edilir.
cur = con.cursor()
# CREATE TABLE ifadesiyle tablo oluşturma
cur.execute("""
CREATE TABLE IF NOT EXISTS film (
title TEXT,
year INTEGER,
score REAL
)
""")
print("Tablo oluşturma işlemi başarılı!")
5. Veritabanına Güvenli Veri Ekleme (INSERT)
Tablomuz hazır, şimdi içine veri ekleyelim. SQL’de kayıt girmek için INSERT INTO komutu kullanılır. Ancak burada çok hayati bir kural vardır: Python’un genel string formatlama yöntemleriyle (örneğin f-string veya + operatörü ile) dışarıdan gelen veriyi doğrudan SQL koduna yazmak, sisteminizi SQL Enjeksiyonu (SQL Injection) adlı büyük bir güvenlik açığına kurban edebilir. Bilgisayar korsanları bu yolla tablonuzu silebilir veya tüm şifrelerinizi çalabilir.
Saldırıların önüne geçmek için parametre değiştirme (parameter substitution) mekanizması kullanılmalıdır. Değerlerin geleceği yerlere mutlaka soru işareti (?) koymalı ve verileri execute() metodunun ikinci argümanı olarak bir demet (tuple) şeklinde iletmelisiniz. SQLite, ? işaretlerinin (yer tutucular) yerine sizin verilerinizi güvenli bir şekilde entegre eder.
Ekleme gibi tabloda değişiklik yaratan işlemlerin diske kalıcı olarak kaydedilmesi (işlemin onaylanması) için con.commit() fonksiyonunu çalıştırmak zorunludur.
# Güvenli veri ekleme yöntemi: ? yer tutucuları kullanımı
cur.execute("INSERT INTO film (title, year, score) VALUES (?, ?, ?)", ("The Matrix", 1999, 8.7))
# Yapılan değişikliklerin kalıcı olması için onaylıyoruz
con.commit()
print("Film kaydı veritabanına eklendi!")
Toplu Veri Ekleme: Eğer elinizde aynı anda eklemeniz gereken bir veritabanı listesi varsa, executemany() fonksiyonunu kullanarak tüm listeyi tek bir satır komutla veritabanına işleyebilirsiniz.
diger_filmler = [
("Inception", 2010, 8.8),
("Interstellar", 2014, 8.6),
("The Dark Knight", 2008, 9.0)
]
cur.executemany("INSERT INTO film VALUES (?, ?, ?)", diger_filmler)
con.commit()
print("Toplu veri ekleme işlemi tamamlandı!")
6. Veritabanından Veri Okuma (SELECT)
Kaydettiğimiz verileri görmek için SELECT SQL komutuna başvururuz. Sorguyu çalıştırdıktan sonra sonuçları Python üzerinde görebilmek için fetchall() metodunu kullanabiliriz. Bu metot, eşleşen tüm satırları çeker ve içinde demetler (tuple) bulunan bir liste döndürür.
Ayrıca İmleç (Cursor) nesneleri yinelenebilir (iterator) bir yapıya sahip olduğu için, hiç fetchall() kullanmadan imlecin kendisi üzerinde bir for döngüsü başlatarak eşleşen satırları doğrudan da elde edebiliriz.
# Tüm filmleri seçen SELECT sorgusu
cur.execute("SELECT * FROM film")
# İmleç (Cursor) üzerinden doğrudan döngü ile verileri okuma
for satir in cur:
print(f"Film: {satir}, Yıl: {satir}, Puan: {satir}")
7. Veri Güncelleme (UPDATE) ve Silme (DELETE)
Kayıtlı verilerinizde düzeltmeler veya temizlik yapmanız gerektiğinde, güncellemek için UPDATE ve silmek için DELETE komutlarını kullanabilirsiniz. Bu işlemlerde de güvenliği elden bırakmayarak daima ? yer tutucusunu kullanmalıyız. Tablodaki mevcut bilgiler değiştirileceği için bu işlemlerden sonra con.commit() komutunu çağırarak operasyonu onaylamalısınız.
# Inception filminin puanını UPDATE komutu ile 9.1 yapalım
cur.execute("UPDATE film SET score = ? WHERE title = ?", (9.1, "Inception"))
con.commit()
# İstenmeyen The Matrix filmini DELETE komutu ile tablodan silelim
cur.execute("DELETE FROM film WHERE title = ?", ("The Matrix",))
con.commit()
8. Hata (Exception) Yönetimi
Veritabanlarında bazen veritabanı kilitli kalabilir veya yanlış bir SQL komutu kullanabilirsiniz. sqlite3 modülü oluşabilecek durumlara karşı özel hata sınıflarına (Exceptions) sahiptir. Örneğin bir birincil anahtar (Primary Key) kuralını ihlal ettiğinizde veya benzersiz bir değeri tekrar eklemeye çalıştığınızda IntegrityError oluşur. Arka planda donanımsal ya da dosya sistemine bağlı bir hata yaşandığında OperationalError alırsınız. Eğer SQL diziliminiz (syntax) hatalıysa ya da bağlanmayan/kapanmış bir tabloya erişiyorsanız programınız ProgrammingError ile durdurulur. Tüm veritabanı sorgularınızı olası çökmeleri önlemek için profesyonelce bir try-except-finally bloğu içine alarak yönetebilirsiniz.
9. Veritabanı Bağlantısını Kapatma (Close İşlemi)
Her veritabanı bağlantısı açıldığında, donanımda yer ve kaynak ayrılır. İşiniz tamamen bittiğinde bu kaynakları serbest bırakmak ve verilerinizin diske eksiksiz yazıldığından %100 emin olmak için bağlantınızı con.close() komutunu kullanarak kapatmalısınız.
close() komutunu kullanmadan programınızı sonlandırır veya Connection nesnesini doğrudan bellekten silerseniz (delete işlemi), Python arka planda potansiyel sızıntılara işaret eden bir ResourceWarning uyarısı çıkaracaktır. Ayrıca close() çağrıldıktan sonra kapanmış olan imleci (cursor) tekrar kullanmaya çalışırsanız ProgrammingError hatası fırlatılacaktır.
# İşlemler bitince bağlantıyı güvenle kapatıyoruz
con.close()
print("Veritabanı bağlantısı başarıyla sonlandırıldı.")
Özet Olarak: Python programlama dili, SQLite kütüphanesi sayesinde sadece birkaç satırlık kodlarla veritabanı yetenekleri sergileyebilir. Ekstra bir kurulum yapmadan sadece import sqlite3 diyerek başladığınız bu yolda; SQL enjeksiyonlarından korunmak adına güvenli bir şekilde ? parametresini kullanmayı ve commit() metodu ile değişiklikleri doğrulamayı öğrendiniz. Veritabanı işlemleri yeteneği, programlarınızı statik yazılımlardan kurtarıp modern, dinamik ve profesyonel yazılımlara dönüştürecek harika bir donanımdır.







2 Yorum
Furkan hocamız harika şekilde açıklamıssınız teşekkür ederiz
Maşallah Çok İyi Olmuş.