Tek kullanıcılı uygulamada SQLite ve libSQL
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.