← Blog

Tek kullanıcılı uygulamada SQLite ve libSQL

24 Ekim 2026·2 dakikayazılımveritabanıNext.js

Bu sitenin arkasındaki kişisel panel (finans, sağlık, kelime çalışması, özel günler) tek bir kullanıcıya hizmet ediyor: bana. Böyle bir uygulama için Postgres, bağlantı havuzları ve yönetilen bir veritabanı hizmeti fazlasıyla büyük geldi. Seçimim libSQL oldu: SQLite'ın sadeliği, ağ üzerinden erişilebilen bir sunucuyla.

Neden SQLite ailesi?

  • Sadelik: tek dosya, sıfır yapılandırma. Yerelde geliştirirken veritabanı projenin içindeki bir dosyadır.
  • Hız: tek kullanıcılı bir yükte okuma ve yazmalar milisaniyelerin altında.
  • Yedekleme: bütün veritabanını tek bir SQL dökümü olarak almak bir komut sürüyor. Her büyük veri değişikliğinden önce canlı veritabanının yedeğini alıyorum.

libSQL ne ekliyor?

SQLite dosya tabanlıdır; Vercel gibi sunucusuz bir ortamda kalıcı bir dosya yoktur. libSQL, SQLite ile uyumlu bir sunucu (sqld) sunuyor: kendi sunucumda çalışan bu servise uygulama HTTP üzerinden bağlanıyor. Böylece yerelde dosya, canlıda sunucu; kod ise aynı.

Drizzle ile şema

Veri erişimi için Drizzle ORM kullanıyorum: şema TypeScript'te tanımlı, sorgular tipli. Şema değişikliklerini ise elle yazılmış, tekrar çalıştırılması güvenli betiklerle yönetiyorum:

const SQL = [
  `CREATE TABLE IF NOT EXISTS special_days (id integer PRIMARY KEY AUTOINCREMENT,
     name text NOT NULL, month integer NOT NULL, day integer NOT NULL, ...)`,
  `CREATE INDEX IF NOT EXISTS sd_md_idx ON special_days (month, day)`,
];
for (const s of SQL) await client.execute(s);

IF NOT EXISTS sayesinde betik yerelde de canlıda da, bir kez de on kez de çalıştırılsa aynı sonucu verir. Sıra hep aynı: önce canlı veritabanının yedeği, sonra migrasyon, en son kodun yayına alınması. Kod, tablosu olmayan bir veritabanıyla hiç karşılaşmaz.

Sınırlar

  • Eşzamanlı yazma: SQLite tek bir yazıcıya izin verir. Tek kullanıcılı bir panelde sorun değil; çok kullanıcılı, yazma yoğun bir uygulamada olurdu.
  • Tip sistemi: SQLite'ın tipleri esnektir. Para gibi hassas alanlarda uygulama katmanında disiplin gerekir; bunu para alanları yazısında anlattım.
  • Gelişmiş özellikler: Postgres'in zengin veri tipleri ve uzantıları yok. İhtiyaç duyduğum an, taşıma zamanı gelmiş demektir.

Veritabanı seçimi bir ADR'ye değer bir karardır: neden bu seçenek, hangi sınırlar kabul edildi, ne zaman yeniden düşünülecek. Karar kaydı yazmayı ADR yazısında anlattım.

Panelin geri kalanının nasıl yapıldığını finans paneli yazısında ve kolofon sayfasında bulabilirsiniz.