SQLite, tek bir dosyada çalışan, ayrı bir sunucu gerektirmeyen ve doğrudan uygulamanın içine gömülen küçük ama tam özellikli bir SQL veritabanı motorudur. Akıllı telefonlardan web tarayıcılarına, masaüstü programlarından gömülü cihazlara kadar sayısız yerde sessizce çalışır. Bu rehberde SQLite'in ne olduğunu, nasıl çalıştığını, güçlü ve zayıf yönlerini ve hangi durumlarda doğru seçim olduğunu ayrıntılı biçimde ele alıyoruz.
SQLite Nedir?
SQLite, C dilinde yazılmış; kendi kendine yeten (self-contained), sunucusuz, sıfır yapılandırmalı ve işlemsel (transactional) bir SQL veritabanı motorudur. Klasik veritabanı sistemlerinden farklı olarak ayrı bir sunucu süreci yoktur; motor bir kütüphane olarak doğrudan uygulamaya bağlanır. Bir veritabanının tamamı; yani tablolar, indeksler, şema tanımları ve verilerin hepsi diskte tek bir platform bağımsız dosyada saklanır.
Proje ilk olarak 2000 yılında D. Richard Hipp tarafından yayımlandı ve o günden bu yana geliştirilmeye devam ediyor. Kaynak kodu kamu malıdır (public domain) ve resmî belgelerine göre farklı platformlarda çalışan, geriye dönük uyumlu bir dosya biçimi sunar. Bugün mobil işletim sistemleri, tarayıcılar ve pek çok masaüstü uygulaması veriyi arka planda SQLite ile saklar; bu da onu dünyanın en yaygın kullanılan veritabanı motorlarından biri yapar.
SQLite'i geniş veritabanı ailesi içinde nereye koyduğunuzu görmek için veritabanı türleri rehberimize göz atabilirsiniz.
Sunucusuz (Serverless) Mimari Nasıl Çalışır?
Çoğu veritabanı istemci-sunucu modeliyle çalışır: arka planda sürekli açık kalan bir sunucu süreci vardır ve uygulamalar bir ağ/soket bağlantısı üzerinden sorgu gönderip yanıt alır. SQLite bu yaklaşımı tersine çevirir. Ayrı bir sunucu yoktur; uygulamanız SQLite kütüphanesini kendi süreci içinde çağırır ve veritabanı dosyasını doğrudan okur ve yazar.
Bu tasarım ağ gecikmesini, ayrı bir servisi ayakta tutma yükünü ve pek çok yapılandırma adımını ortadan kaldırır. Bunun karşılığında, SQLite tek bir makinede ve genellikle tek bir uygulamayla birlikte çalışacak biçimde konumlanır; ağ üzerinden çok kullanıcılı erişim onun asıl hedefi değildir.
Pratikte bu, uygulamanızın SQLite kütüphanesini derleme aşamasında veya bir bağımlılık olarak içine alması demektir. Sorgular ayrı bir sürece gönderilmez; aynı süreç içinde, doğrudan fonksiyon çağrılarıyla işlenir. Böylece dağıtım basitleşir: kurmanız gereken tek bir çalıştırılabilir dosya ve yanında bir veritabanı dosyası kalır. Bu sadelik, SQLite'i özellikle son kullanıcının makinesinde çalışan yazılımlar için cazip kılar.
| Özellik | SQLite (gömülü) | İstemci-Sunucu (örn. PostgreSQL/MySQL) |
|---|---|---|
| Sunucu süreci | Yok; kütüphane olarak gömülür | Sürekli çalışan ayrı süreç |
| Kurulum | Sıfır yapılandırma | Kurulum ve yapılandırma gerektirir |
| Veri konumu | Tek dosya | Sunucunun yönettiği veri dizini |
| Ağ erişimi | Yerel; ağ protokolü yok | Ağ üzerinden çok istemci |
| Eşzamanlı yazma | Aynı anda tek yazar | Çok sayıda eşzamanlı yazar |
| Tipik kullanım | Uygulama içi depolama | Merkezî, çok kullanıcılı sistemler |
Tek Dosya ve Sıfır Yapılandırma
SQLite veritabanı, işletim sisteminden bağımsız tek bir dosyadır. Bu dosyayı kopyalamak, taşımak veya e-postayla göndermek veritabanının tamamını taşımak anlamına gelir. Ayrı bir yönetici hesabı, port açma veya servis başlatma gibi adımlar yoktur; kütüphaneyi programınıza ekleyip dosya yolunu vermeniz yeterlidir.
- Taşınabilirlik — Dosya biçimi platformlar arasında uyumludur; aynı dosya Windows, Linux ve macOS'te açılır.
- Basit yedekleme — Veritabanı boştayken dosyayı kopyalamak yedek almak için çoğu zaman yeterlidir.
- Dağıtım kolaylığı — Uygulamanızla birlikte hazır bir veri dosyası gönderebilirsiniz.
- Az bakım — Yönetilecek ayrı bir sunucu, kullanıcı ya da bağlantı havuzu yoktur.
Depolama Sınıfları ve Tip Yakınlığı (Type Affinity)
SQLite, çoğu SQL veritabanından farklı olarak dinamik tipleme kullanır. Bir sütuna atadığınız tip katı bir kısıtlama değil, bir "yakınlık" (affinity) belirtir; değerler kendi depolama sınıflarında saklanır. SQLite'te beş depolama sınıfı vardır.
| Depolama Sınıfı | Açıklama |
|---|---|
| NULL | Boş / tanımsız değer |
| INTEGER | İşaretli tam sayı (boyutuna göre değişken bayt) |
| REAL | Kayan noktalı (ondalıklı) sayı |
| TEXT | Metin (UTF-8, UTF-16 gibi kodlamalarla) |
| BLOB | Ham ikili veri; girildiği gibi saklanır |
Sütun tipi tanımlarken TEXT, INTEGER, REAL, NUMERIC ve BLOB gibi yakınlıklar belirlenir. Örneğin INTEGER yakınlığı olan bir sütuna sayısal bir metin verirseniz SQLite onu tam sayıya dönüştürmeye çalışır. Daha katı davranış isteyenler için SQLite, sütun tiplerini zorunlu kılan STRICT tablolar seçeneğini de sunar.
Temel SQL Kullanımı
SQLite, standart SQL'in büyük bölümünü destekler. Aşağıda tablo oluşturma, veri ekleme ve sorgulama için basit bir örnek yer alıyor.
-- Tablo oluştur
CREATE TABLE makaleler (
id INTEGER PRIMARY KEY,
baslik TEXT NOT NULL,
goruntulenme INTEGER DEFAULT 0,
yayin TEXT -- ISO 8601 tarih metni
);
-- Veri ekle
INSERT INTO makaleler (baslik, yayin)
VALUES ('SQLite Nedir?', '2026-09-28');
-- Sorgula
SELECT id, baslik, goruntulenme
FROM makaleler
WHERE goruntulenme > 100
ORDER BY yayin DESC;SQLite; ortak tablo ifadeleri (CTE), pencere fonksiyonları (window functions), JSON işleme fonksiyonları, tam metin araması (FTS5) ve R-Tree gibi mekânsal indeksleme eklentileri gibi ileri özellikleri de destekler. Python gibi bazı dillerde ise SQLite, standart kütüphanenin bir parçası olarak hazır gelir; bu da ek bir sürücü kurmadan hemen veri saklamaya başlamanızı sağlar.
Komut satırından hızlıca çalışmak isteyenler için resmî sqlite3 kabuk aracı vardır. Bu araçla veritabanını açabilir, tabloları listeleyebilir, sorgu çalıştırabilir ve verileri içe/dışa aktarabilirsiniz. Ayrıca neredeyse her popüler programlama dili için hazır bağlantı kütüphaneleri bulunur, bu da SQLite'i farklı teknoloji yığınlarına kolayca entegre edilebilir kılar.
İşlemler (Transactions) ve ACID Güvencesi
SQLite ACID uyumludur: işlemler atomik, tutarlı, yalıtılmış ve kalıcıdır. Bu, bir grup değişikliğin ya tümüyle uygulanacağı ya da hiç uygulanmayacağı anlamına gelir. Elektrik kesintisi veya çökme gibi durumlarda bile veritabanı tutarlı bir duruma döner.
BEGIN TRANSACTION;
UPDATE hesaplar SET bakiye = bakiye - 100 WHERE id = 1;
UPDATE hesaplar SET bakiye = bakiye + 100 WHERE id = 2;
COMMIT; -- İki güncelleme birlikte kalıcı olur
-- Hata olursa: ROLLBACK; ile tümü geri alınırEşzamanlılık ve WAL Modu
SQLite varsayılan olarak bir rollback journal kullanır. Alternatif olarak Write-Ahead Logging (WAL) modu açılabilir. WAL modunda okuyucular, bir yazar aktifken bile veritabanını okumaya devam edebilir; bu da çok sayıda okuma ve arada yazma içeren yükler için eşzamanlılığı iyileştirir.
-- WAL modunu etkinleştir (veritabanı başına bir kez)
PRAGMA journal_mode = WAL;
-- Dayanıklılık/performans dengesini ayarla
PRAGMA synchronous = NORMAL;SQLite Ne Zaman Doğru Seçimdir?
SQLite'in kendi belgeleri onu genellikle bir ağ veritabanına değil, doğrudan dosya okuma/yazma işlemlerine (fopen benzeri) bir alternatif olarak konumlandırır. Aşağıdaki senaryolarda güçlü bir tercihtir.
- Mobil ve masaüstü uygulamalar — Cihaz üzerinde yerel veri saklama.
- Gömülü sistemler ve IoT — Sınırlı kaynaklı cihazlarda hafif depolama.
- Uygulama dosya biçimi — Karmaşık belgeleri tek yapılandırılmış dosyada saklama.
- Test ve geliştirme — Hızlı kurulum gerektiren geçici veya bellek içi veritabanları.
- Önbellek ve kenar (edge) — Okuma ağırlıklı, düşük gecikmeli yerel veri erişimi.
- Küçük ve orta ölçekli siteler — Trafiği çoğunlukla okumadan oluşan projeler.
Ne Zaman Sunucu Tabanlı Bir Veritabanı Seçmeli?
Projeniz ağ üzerinden çok kullanıcılı erişim, yüksek eşzamanlı yazma hacmi, ayrıntılı kullanıcı/rol yönetimi veya yatay ölçekleme gerektiriyorsa istemci-sunucu bir veritabanı daha uygundur. Bu noktada PostgreSQL veya MySQL gibi motorlar devreye girer. Uygulamanız SQLite ile başlayıp büyüdükçe sunucu tabanlı bir veritabanına taşınabilir; SQL bilginizin çoğu bu geçişte işinize yarar.
Lisans: Kamu Malı (Public Domain)
SQLite'in çekirdek kaynak kodu telif haklarından muaf tutulmuş ve kamu malı (public domain) olarak yayımlanmıştır; herkes ticari ya da özel amaçlarla serbestçe kullanabilir. Bazı kuruluşlar hukuki güvence için isteğe bağlı, ücretli bir "mülkiyet garantisi" (warranty of title) satın alabilir. SQLite ekosisteminde ayrıca şifreleme gibi bazı isteğe bağlı, ticari lisanslı eklentiler de bulunur.
Yedekleme ve Bakım
SQLite tek dosya olduğu için yedekleme çoğu zaman basittir. Veritabanı boştayken dosyayı kopyalamak yeterli olabilir; ancak veritabanı aktif kullanılıyorsa tutarlı bir yedek için komut satırı araçlarını veya online yedekleme mekanizmalarını kullanmak daha güvenlidir.
# Tüm veritabanını SQL betiğine dök
sqlite3 veri.db ".dump" > yedek.sql
# Optimize edilmiş bir kopya oluştur (VACUUM INTO)
sqlite3 veri.db "VACUUM INTO 'yedek.db';"SQLite'in Sınırları ve Dikkat Edilecek Noktalar
Hiçbir veritabanı her iş için ideal değildir. SQLite'in bilinçli olarak yaptığı tasarım tercihleri bazı senaryolarda sınır oluşturur.
- Eşzamanlı yazma — Aynı anda tek yazar; yazma yoğun, çok kullanıcılı sistemler için uygun değildir.
- Ağ erişimi — Yerel dosya erişimi için tasarlanmıştır; ağ dosya sistemleri üzerinden paylaşım sorun çıkarabilir.
- Kullanıcı/rol yönetimi — Sunucu veritabanlarındaki gibi yerleşik ayrıntılı erişim denetimi yoktur; güvenlik uygulama katmanındadır.
- Çok büyük ölçek — Belgelenen kuramsal boyut sınırı yüksek olsa da, çok büyük ve çok kullanıcılı sistemler için sunucu tabanlı motorlar daha uygundur.
Anahtar-değer odaklı gömülü depolama gibi farklı bir yaklaşım arıyorsanız Berkeley DB gibi alternatifleri de değerlendirebilirsiniz.