Web SQL'den SQLite Wasm'a: Veritabanı taşıma kılavuzu

SQLite Wasm, kaynak özel dosya sistemi tarafından desteklenmektedir. Bu sayede, desteği sonlandırılan Web SQL veritabanı teknolojisinin yerine çok yönlü bir alternatif sunulmaktadır. Bu makale, verilerinizi Web SQL'den SQLite Wasm'e taşımayla ilgili bir kılavuzdur.

Gerekli arka plan

Web SQL desteğini sonlandırma ve Web SQL'i kaldırma başlıklı yayında, Web SQL veritabanı teknolojisinin desteğinin sonlandırıldığı duyuruldu. Teknolojinin kendisi kullanımdan kaldırılmış olsa da teknolojinin ele aldığı kullanım alanları pek bir sorun teşkil etmemektedir. Bu nedenle, SQLite Wasm'ın tarayıcıdaki Origin Private File System tarafından desteklenen takip yayını, SQLite veritabanına dayalı, Web Assembly'de derlenen (Wasm) ve kaynak özel dosya sistemi tarafından desteklenen yedek bir teknoloji grubunu özetler. Bu makalede, veritabanlarının Web SQL'den SQLite Wasm'e nasıl taşınacağı gösterilmektedir.

Veritabanlarınızı taşıma

Aşağıdaki dört adım, bir Web SQL veritabanını kaynak özel dosya sistemi tarafından desteklenen SQLite veritabanına sahip SQLite Wasm'a taşımaya ilişkin kavramsal fikri göstermektedir. Bu, Web SQL taşıma ihtiyaçlarınıza göre özelleştirilmiş kendi kodunuzun temeli olabilir.

Taşınacak Web SQL veritabanları

Bu taşıma kılavuzunun temel varsayımı, uygulamanızla alakalı verileri barındıran bir veya daha fazla mevcut Web SQL veritabanınızın olduğudur. Aşağıdaki ekran görüntüsünde, hava durumunu şiddet dereceleriyle eşleyen bir yağmur fırtınası tablosu içeren mydatabase adlı örnek bir veritabanı gösterilmektedir. Chrome Geliştirici Araçları, aşağıdaki ekran görüntüsünde gösterildiği gibi hata ayıklama için Web SQL veritabanlarını görüntülemenize olanak tanır.

Chrome'un Geliştirici Araçları'nda incelenen bir Web SQL veritabanı. Veritabanı mydatabase olarak adlandırılır ve üç sütunlu bir tablo barındırır: satır kimliği, ruh hali ve önem derecesi. Üç satır örnek veri vardır.

Web SQL veritabanını SQL ifadelerine çevirme

Verileri kullanıcı için şeffaf bir şekilde taşımak, yani kullanıcının taşıma adımlarından herhangi birini kendi başına gerçekleştirmesini gerektirmeden taşımak için veritabanındaki veri parçalarının, onları ilk kez oluşturan orijinal SQL ifadelerine geri çevrilmesi gerekir. Bu sorun daha önce de yaşanmıştır. Bu makalede kullanılan taşıma komut dosyası (mywebsqldump.js), bazı küçük ayarlamalarla websqldump.js adlı bir topluluk kitaplığını temel alır. Aşağıdaki kod örneğinde, mydatabase adlı Web SQL veritabanını bir SQL ifadesi grubuna çevirmek için gereken kod gösterilmektedir.

websqldump.export({
  database: 'mydatabase',
  version: '1.0',
  success: function(sql) {
    // The SQL statements.
  },
  error: function(err) {
    // Handle the error.
  }
});

Bu kod çalıştırıldığında aşağıdaki SQL ifadeleri dizesi oluşturulur.

CREATE TABLE IF NOT EXISTS rainstorms (mood text, severity int);
INSERT INTO rainstorms(mood,severity) VALUES ('somber','6');
INSERT INTO rainstorms(mood,severity) VALUES ('rainy','8');
INSERT INTO rainstorms(mood,severity) VALUES ('stormy','2');

Verileri SQLite Wasm'e aktarma

Geriye kalan tek şey bu SQL komutlarını SQLite Wasm bağlamında yürütmektir. SQLite Wasm'i ayarlamayla ilgili tüm ayrıntılar için Origin Private File System tarafından desteklenen tarayıcıda SQLite Wasm makalesine göz atmanızı öneririz. Özet bilgileri aşağıda bulabilirsiniz. Bu kodun, gerekli HTTP üstbilgileri ile doğru bir şekilde ayarlanmış bir Çalışanda (kitaplığın sizin için otomatik olarak oluşturduğu) çalışması gerektiğini unutmayın. @sqlite.org/sqlite-wasm paketini npm'den yükleyebilirsiniz.

import { sqlite3Worker1Promiser } from '@sqlite.org/sqlite-wasm';

(async () => {
  try {
    const promiser = await new Promise((resolve) => {
      const _promiser = sqlite3Worker1Promiser({
        onready: () => {
          resolve(_promiser);
        },
      });
    });

    let response;

    response = await promiser('open', {
      filename: 'file:mydatabase.db?vfs=opfs',
    });
    const { dbId } = response;

    const sql = `
      CREATE TABLE IF NOT EXISTS rainstorms (mood text, severity int);
      INSERT INTO rainstorms(mood,severity) VALUES ('somber','6');
      INSERT INTO rainstorms(mood,severity) VALUES ('rainy','8');
      INSERT INTO rainstorms(mood,severity) VALUES ('stormy','2');`
    await promiser('exec', { dbId, sql });

    await promiser('close', { dbId });
  } catch (err) {
    if (!(err instanceof Error)) {
      err = new Error(err.result.message);
    }
    console.error(err.name, err.message);
  }
})();

Bu kodu çalıştırdıktan sonra, içe aktarılan veritabanı dosyasını OPFS Explorer Chrome Geliştirici Araçları uzantısıyla inceleyin. Artık biri gerçek veritabanını, diğeri de günlük kaydı bilgilerini içeren iki dosya var. Bu iki dosyanın kaynak özel dosya sisteminde bulunduğunu, dolayısıyla bu dosyaları görmek için OPFS Gezgini uzantısını kullanmanız gerektiğini unutmayın.

Kaynak gizli dosya sistemini OPFS Explorer Chrome Geliştirici Araçları ile inceleme. Biri mydatabase.db, diğeri mydatabase.db-journal adlı iki dosya vardır.

İçe aktarılan verilerin ilk Web SQL verileriyle aynı olduğunu doğrulamak için dosyayı tıklayın mydatabase.db. OPFS Explorer uzantısı, dosyayı kullanıcı tarafından görülebilen dosya sistemine kaydetmenize olanak tanıyan bir Dosyayı Kaydet iletişim kutusu gösterir. Veritabanı dosyası kaydedildikten sonra verileri keşfetmek için bir SQLite görüntüleyici uygulaması kullanın. Project Fugu API Showcase'ta tarayıcıda SQLite ile çalışmak için çeşitli uygulamalar yer alır. Örneğin Sqlime — SQLite Playground, sabit diskinizden SQLite veritabanı dosyasını açmanıza ve veritabanında sorgu çalıştırmanıza olanak tanır. Aşağıdaki ekran görüntüsünde gördüğünüz gibi, yağmur fırtınası tablosu SQLite'e doğru şekilde aktarılmıştır.

Sqlime SQLite Playground aracında mydatabase.db dosyasını keşfediyoruz. Uygulama, 10 çalıştırma sınırı olan yağmur fırtınasından SQL sorgusu seçim yıldızı ile gösterilmektedir. Bunun sonucunda, Web SQL'deki ilk örnek veriden üç satır elde edilmiştir.

Web SQL depolama alanında yer açma

Web SQL veritabanını silmek mümkün olmasa da (biraz şaşırtıcı bir şekilde) verileri SQLite Wasm'e taşıdıktan sonra artık kullanılmayan Web SQL tablolarını bırakarak depolama alanında yer açabilirsiniz. Web SQL veritabanındaki tüm tabloları listelemek ve JavaScript kullanarak bırakmak için aşağıdaki snippet'teki gibi kodu kullanın:

const dropAllTables = () => {
  try {
    db.transaction(function (tx) {
      tx.executeSql(
        "SELECT name FROM sqlite_master WHERE type='table' AND name !='__WebKitDatabaseInfoTable__'",
        [],
        function (tx, result) {
          const len = result.rows.length;
          const tableNames = [];
          for (let i = 0; i < len; i++) {
            const tableName = result.rows.item(i).name;
            tableNames.push(`'${tableName}'`);
            db.transaction(function (tx) {
              tx.executeSql('DROP TABLE ' + tableName);
            });
          }
          console.log(`Dropped table${tableNames.length > 1 ? 's' : ''}: ${tableNames.join(', ')}.`);
        }
      );
    });
  } catch (err) {
    console.error(err.name, err.message);
  }
};

Taşıma işleminden sonra verilerle çalışma

Verileri taşıdıktan sonra, bu Başlangıç kod örneğinde belirtildiği şekilde verilerle çalışın. Ayrıntılar için SQLite Wasm API referansına bakın. Depolama arka uç olarak orijinal özel dosya sistemini kullanıyorsanız SQLite Wasm'e bir İşleyici'den erişmeniz gerektiğini hatırlatmak isteriz.

Test edin

Bu demo, bir Web SQL veritabanını örnek verileriyle doldurmanıza olanak tanır. Ardından, Web SQL verilerini SQL ifadeleri olarak döker. Bu veriler daha sonra kaynak özel dosya sistemi tarafından desteklenen SQLite Wasm'e aktarılır. Son olarak, eski Web SQL verilerini silerek depolama alanında yer açarsınız. Yama uygulanmış mywebsqldump.js dosyası da dahil olmak üzere uygulamanın tamamı için kaynak kodunu kontrol edin.

web-sql-to-sqlite-wasm.glitch.me adresindeki demo uygulama.

Sonuçlar

Web SQL veritabanlarınızı, kaynak özel dosya sistemi tarafından desteklenen SQLite Wasm'e kullanıcılarınıza görünmeyecek şekilde taşıyabilirsiniz. Kullanıcılar, verilerinin artık bir SQLite veritabanında, kaynak özel dosya sisteminde barındırıldığını ve Web SQL'de bulunmadığını fark etmez. Genel olarak, Web SQL'den SQLite'e geçiş, uygulamalarının uzun vadeli kararlılığını ve ölçeklenebilirliğini sağlamak isteyen web geliştiricileri için gerekli bir adımdır. Bu süreç başlangıçta biraz çaba gerektirse de daha güçlü, esnek ve her şeyden önce geleceğe hazır bir veritabanı çözümünün avantajları, bu yatırımı kesinlikle değerli kılar.