Tüm depolama alanınızı web'de etkili bir şekilde yönetmek için SQLite'i kullanın.
SQLite, popüler, açık kaynak, hafif, yerleşik bir ilişkisel veritabanı yönetim sistemidir. Birçok geliştirici, verileri yapılandırılmış ve kullanımı kolay bir şekilde depolamak için bu aracı kullanır. Küçük boyutu ve düşük bellek gereksinimleri nedeniyle SQLite, genellikle mobil cihazlarda, masaüstü uygulamalarında ve web tarayıcılarında veritabanı motoru olarak kullanılır.
SQLite'in en önemli özelliklerinden biri, sunucusuz bir veritabanı olmasıdır. Bu, çalışması için ayrı bir sunucu işlemi gerektirmediği anlamına gelir. Bunun yerine, veritabanı kullanıcının cihazında tek bir dosyada depolanır. Bu sayede, uygulamalara entegrasyonu kolaylaştırılır.
Web Assembly tabanlı SQLite
Web Assembly'e (Wasm) dayalı, web tarayıcılarında kullanılmasını sağlayan birçok resmi olmayan SQLite sürümü vardır (ör. sql.js). sqlite3 WASM/JS alt projesi, desteklenen SQLite yayınları ailesinin yerleşik üyelerinin kitaplığından Wasm derlemeleri oluşturan SQLite projesi ile resmi olarak ilişkilendirilen ilk çalışmadır. Bu projenin somut hedefleri şunlardır:
- Kullanım açısından mümkün olduğunca C API'sine yakın olan düşük düzey bir sqlite3 API bağlama.
- Doğrudan düşük düzey API ile konuşan, sql.js ve Node.js tarzı uygulamalara daha yakın, daha üst düzey bir nesne yönelimli API. Bu API, düşük düzey API ile aynı iş parçacığında kullanılmalıdır.
- Worker mesajları aracılığıyla önceki API'lerle iletişim kuran, Worker tabanlı bir API. Bu API, alt düzey API'lerin bir İşçi mesaj dizisine yüklenmesi ve İşçi mesajları aracılığıyla onlarla iletişim kurulması için ana mesaj dizisinde kullanılmak üzere tasarlanmıştır.
- İşçi API'sinin, iş parçacığı arası iletişim özelliklerini kullanıcıdan tamamen gizleyen, Promise tabanlı bir varyantı.
- Kaynak Özel Dosya Sistemi (OPFS) dahil olmak üzere mevcut JavaScript API'lerini kullanarak kalıcı istemci tarafı depolama alanı desteği.
SQLite Wasm'i Origin Private File System kalıcı arka ucu ile kullanma
Kitaplığı npm'den yükleme
Aşağıdaki komutu kullanarak npm'den @sqlite.org/sqlite-wasm paketini yükleyin:
npm install @sqlite.org/sqlite-wasm
Origin Özel Dosya Sistemi
Kaynak Özel Dosya Sistemi (OPFS, File System Access API'nin bir parçasıdır), verilere çok yüksek performanslı erişim sağlayan özel bir yüzeyle desteklenir. Bu yeni yüzey, bir dosyanın içeriğine yerinde ve özel yazma erişimi sunarak mevcut yüzeylerden farklıdır. Bu değişiklik, temizlenmemiş değişiklikleri tutarlı bir şekilde okuma özelliği ve özel çalışanlarda senkron bir varyantın kullanılabilirliğiyle birlikte performansı önemli ölçüde artırır ve yeni kullanım alanlarının önünü açar.
Tahmin edebileceğiniz gibi, projenin hedeflerinin son noktası olan mevcut JavaScript API'leri kullanarak istemci tarafında kalıcı depolama desteği, verileri veritabanı dosyasında kalıcı hale getirmeyle ilgili katı performans koşullarıyla birlikte gelir.
Bu noktada, Kaynak Özel Dosya Sistemi ve daha spesifik olarak FileSystemFileHandle
öğelerinin createSyncAccessHandle()
yöntemi devreye girer. Bu yöntem, bir dosyaya senkronize olarak okuma ve yazma yapmak için kullanılabilecek bir FileSystemSyncAccessHandle
objesi döndüren bir Promise döndürür. Bu yöntemin senkronize yapısı performans avantajları sağlar ancak bu nedenle, ana iş parçacığı engellenmemesi için yalnızca Kaynak Özel Dosya Sistemi'ndeki dosyalar için özel Web İşleyiciler içinde kullanılabilir.
Gerekli üstbilgileri ayarlama
İndirilen SQLite Wasm arşivi, diğer dosyaların yanı sıra sqlite3 WASM/JS derlemesini oluşturan sqlite3.js
ve sqlite3.wasm
dosyalarını içerir. jswasm
dizini temel sqlite3 yayınlarını, üst düzey dizin ise demo ve test uygulamalarını içerir. Tarayıcılar, file://
URL'lerinden Wasm dosyaları yayınlamaz. Bu nedenle, bu URL'leri kullanarak oluşturduğunuz uygulamalar için bir web sunucusu gerekir ve bu sunucu, dosyaları yayınlarken yanıtında aşağıdaki üstbilgileri içermelidir:
Cross-Origin-Opener-Policy
, tarama bağlamını yalnızca aynı kaynaktaki dokümanlarla izole edensame-origin
yönergesi olarak ayarlanır. Kaynaklar arası dokümanlar aynı tarama bağlamında yüklenmez.Cross-Origin-Embedder-Policy
,require-corp
yönergesi olarak ayarlanır. Böylece, bir doküman yalnızca aynı kaynaktan veya başka bir kaynaktan yüklenebilir olarak açıkça işaretlenmiş kaynakları yükleyebilir.
Bu üstbilgilerin nedeni, SQLite Wasm'in SharedArrayBuffer
'e bağlı olması ve bu üstbilgilerin ayarlanmasının güvenlik şartlarından biri olmasıdır.
DevTools ile trafiği incelerseniz aşağıdaki bilgileri görürsünüz:
Hız testi
SQLite ekibi, desteği sonlandırılan Web SQL'e kıyasla WebAssembly uygulamalarında bazı karşılaştırmalar yaptı. Bu karşılaştırmalar, SQLite Wasm'in genellikle Web SQL kadar hızlı olduğunu gösteriyor. Bazen biraz daha yavaş, bazen biraz daha hızlı olur. Tüm ayrıntıları sonuçlar sayfasında bulabilirsiniz.
Başlangıç kodu örneği
Daha önce de belirtildiği gibi, Origin Private File System kalıcı arka ucuna sahip SQLite Wasm'in bir Worker bağlamında çalıştırılması gerekir. İyi haber şu ki kitaplık tüm bunları sizin için otomatik olarak yapar ve doğrudan ana mesaj dizisinden kullanabilirsiniz.
import { sqlite3Worker1Promiser } from '@sqlite.org/sqlite-wasm';
(async () => {
try {
console.log('Loading and initializing SQLite3 module...');
const promiser = await new Promise((resolve) => {
const _promiser = sqlite3Worker1Promiser({
onready: () => {
resolve(_promiser);
},
});
});
console.log('Done initializing. Running demo...');
let response;
response = await promiser('config-get', {});
console.log('Running SQLite3 version', response.result.version.libVersion);
response = await promiser('open', {
filename: 'file:worker-promiser.sqlite3?vfs=opfs',
});
const { dbId } = response;
console.log(
'OPFS is available, created persisted database at',
response.result.filename.replace(/^file:(.*?)\?vfs=opfs$/, '$1'),
);
await promiser('exec', { dbId, sql: 'CREATE TABLE IF NOT EXISTS t(a,b)' });
console.log('Creating a table...');
console.log('Insert some data using exec()...');
for (let i = 20; i <= 25; ++i) {
await promiser('exec', {
dbId,
sql: 'INSERT INTO t(a,b) VALUES (?,?)',
bind: [i, i * 2],
});
}
console.log('Query data with exec()');
await promiser('exec', {
dbId,
sql: 'SELECT a FROM t ORDER BY a LIMIT 3',
callback: (result) => {
if (!result.row) {
return;
}
console.log(result.row);
},
});
await promiser('close', { dbId });
} catch (err) {
if (!(err instanceof Error)) {
err = new Error(err.result.message);
}
console.error(err.name, err.message);
}
})();
Demo
Yukarıdaki kodun işleyiş şeklini demoda görebilirsiniz. Glitch'teki kaynak koda göz atın. Aşağıdaki yerleşik sürümde OPFS arka ucu kullanılmaz ancak demoyu ayrı bir sekmede açtığınızda kullanılır.
Kaynak özel dosya sisteminde hata ayıklama
SQLite Wasm'in Origin Private File System çıkışında hata ayıklama yapmak için OPFS Explorer Chrome uzantısını kullanın.
Uzantıyı yükledikten sonra Chrome Geliştirici Araçları'nı açın, OPFS Explorer sekmesini seçin. Ardından, SQLite Wasm'in Kaynak Özel Dosya Sistemi'ne yazdıklarını incelemeye hazırsınız.
Geliştirici Araçları'ndaki OPFS Gezgini penceresindeki dosyalardan herhangi birini seçerseniz yerel diske kaydedebilirsiniz. Ardından, SQLite Wasm'in gerçekten de vaat edildiği gibi çalıştığından emin olmak için veritabanını incelemek üzere SQLite Viewer gibi bir uygulama kullanabilirsiniz.
Yardım alma ve geri bildirim gönderme
SQLite Wasm, SQLite topluluğu tarafından geliştirilip yönetilmektedir. Destek forumunda arama yaparak ve mesaj göndererek yardım alabilir ve geri bildirimde bulunabilirsiniz. Belgelerin tamamına SQLite sitesinden ulaşabilirsiniz.