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

Orijinal özel dosya sistemi tarafından desteklenen SQLite Wasm, desteği sonlandırılan Web SQL veritabanı teknolojisinin çok yönlü bir yerine geçer. 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 desteği sonlandırılmış olsa da teknolojinin ele aldığı kullanım alanları büyük ölçüde geçerliliğini koruyor. Bu nedenle, Kaynak Özel Dosya Sistemi tarafından desteklenen tarayıcıda SQLite Wasm başlıklı takip yayınında, SQLite veritabanına dayalı, Web Assembly (Wasm) olarak derlenmiş ve kaynak özel dosya sistemi tarafından desteklenen yeni bir teknoloji grubu açıklanmaktadır. 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ımda, Web SQL veritabanını SQLite Wasm'e taşıma fikri gösterilmektedir. SQLite veritabanı, kaynak özel dosya sistemi tarafından desteklenmektedir. 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 ortaya çıkmıştı. 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 kodun çalıştırılması, aşağıdaki SQL ifadeleri dizesine neden olur.

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 üst bilgileri doğru şekilde ayarlanmış bir Worker'da (kitaplığın sizin için otomatik olarak oluşturduğu) çalıştırılması 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 ve bu nedenle bunları görmek için OPFS Explorer uzantısını kullanmanız gerektiğini unutmayın.

OPFS Explorer Chrome Geliştirici Araçları ile kaynak gizli dosya sistemini 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 bir SQLite veritabanı dosyası 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. Uygulamada, rainstorms from select star limit 10 SQL sorgusunun çalıştırıldığı gösterilmektedir. Bu sorgu, Web SQL'deki ilk örnek verilerden üç satır döndürür.

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çmanız gerekir. Bir Web SQL veritabanındaki tüm tabloları listelemek ve JavaScript kullanarak bırakmak için aşağıdaki snippet'teki gibi bir kod 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ıç kodu örneğinde açıklandığı şekilde verilerle çalışın. Ayrıntılar için SQLite Wasm API referansı bölümüne bakın. Depolama arka uç olarak kaynak özel dosya sistemini kullanıyorsanız SQLite Wasm'e bir İşleyici'den erişmeniz gerektiğini hatırlatmak isteriz.

Deneyin

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.