From Web SQL to SQLite Wasm: the database migration guide (guida alla migrazione del database)

Con SQLite Wasm supportato dal file system privato di origine, è disponibile un sostituto versatile per la tecnologia di database Web SQL deprecata. Questo articolo è una guida alla migrazione dei dati da Web SQL a SQLite Wasm.

Sfondo obbligatorio

Il post Ritiro e rimozione di Web SQL ha annunciato il ritiro della tecnologia di database Web SQL. Sebbene la tecnologia stessa possa essere ritirata, i casi d'uso affrontati dalla tecnologia non lo sono, quindi il post di follow-up SQLite Wasm nel browser supportato dal file system privato dell'origine illustra un insieme di tecnologie sostitutive basate sul database SQLite, compilato in Web Assembly (Wasm) e supportato dal file system privato dell'origine. Per completare il cerchio, questo articolo mostra come eseguire la migrazione dei database da Web SQL a SQLite Wasm.

Migrazione dei database

I quattro passaggi che seguono mostrano l'idea concettuale della migrazione di un database Web SQL a SQLite Wasm, con il database SQLite supportato dal file system privato di origine. che può servire come base per il tuo codice personalizzato in base alle tue esigenze di migrazione di SQL web.

I database SQL web di cui deve essere eseguita la migrazione

L'assunto di base di questa guida alla migrazione è che tu abbia uno (o più) database Web SQL esistenti che contengono dati pertinenti per la tua app. Nello screenshot di seguito viene mostrato un database di esempio denominato mydatabase con una tabella di piogge torrenziali che mappa gli stati d'animo alle severità. Chrome DevTools ti consente di visualizzare i database SQL web per il debug, come mostrato nello screenshot seguente.

Un database Web SQL ispezionato in Chrome DevTools. Il database si chiama mydatabase e ospita una tabella con tre colonne: ID riga, umore e gravità. Sono presenti tre righe di dati di esempio.

Traduzione del database SQL web in istruzioni SQL

Per eseguire la migrazione dei dati in modo trasparente per l'utente, ovvero senza che debba eseguire autonomamente i passaggi di migrazione, i dati nel database devono essere tradotti nuovamente negli statement SQL originali che li hanno creati. Questa sfida si è già verificata in passato e lo script di migrazione utilizzato in questo articolo, mywebsqldump.js, si basa su una libreria della community chiamata websqldump.js, con alcune piccole modifiche. Il seguente esempio di codice mostra il codice necessario per tradurre il database Web SQL mydatabase in un insieme di istruzioni SQL.

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

L'esecuzione di questo codice genera la stringa di istruzioni SQL riportata di seguito.

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');

Importazione dei dati in SQLite Wasm

Non rimane che eseguire questi comandi SQL nel contesto di SQLite Wasm. Per tutti i dettagli sulla configurazione di SQLite Wasm, ti rimando all'articolo SQLite Wasm nel browser supportato dal file system privato di Origin, ma di seguito trovi un riepilogo. Ricorda che questo codice deve essere eseguito in un worker (creato automaticamente dalla libreria) con le intestazioni HTTP richieste impostate correttamente. Puoi installare il pacchetto @sqlite.org/sqlite-wasm da npm.

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);
  }
})();

Dopo aver eseguito il codice, controlla il file di database importato con l'estensione Chrome DevTools OPFS Explorer. Ora ci sono due file, uno con il database effettivo e uno con le informazioni sul journaling. Tieni presente che questi due file si trovano nel file system privato di origine, quindi devi utilizzare l'estensione OPFS Explorer per visualizzarli.

Ispezione del file system privato di origine con l'esploratore OPFS di Chrome DevTools. Ci sono due file, uno chiamato mydatabase.db e l'altro chiamato mydatabase.db- journal.

Per verificare effettivamente che i dati importati siano gli stessi dei dati SQL web iniziali, fai clic sul file mydatabase.db e l'estensione Explorer OPFS visualizzerà una finestra di dialogo Salva file che ti consente di salvare il file nel file system visibile all'utente. Dopo aver salvato il file del database, utilizza un'app di visualizzazione SQLite per esplorare i dati. La Project Fugu API Showcase include diverse app per lavorare con SQLite nel browser. Ad esempio, Sqlime - SQLite Playground ti consente di aprire un file di database SQLite dal tuo disco rigido ed eseguire query sul database. Come puoi vedere nello screenshot di seguito, la tabella rainstorm è stata importata correttamente in SQLite.

Esplorazione del file mydatabase.db nello strumento Sqlime SQLite Playground. L'app viene mostrata con l'esecuzione della query SQL select star from rainstorms limit 10, che restituisce le tre righe dei dati di esempio iniziali di Web SQL.

Liberazione dello spazio di archiviazione Web SQL

Anche se (forse sorprendentemente) è impossibile eliminare un database SQL web, dovresti comunque liberare un po' di spazio di archiviazione eliminando le tabelle SQL web ora obsolete dopo aver eseguito la migrazione dei dati in SQLite Wasm. Per elencare tutte le tabelle di un database Web SQL e inserirle utilizzando JavaScript, utilizza il codice riportato nel seguente snippet:

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);
  }
};

Utilizzo dei dati dopo la migrazione

Dopo aver eseguito la migrazione dei dati, utilizzali come descritto in questo esempio di codice per iniziare. Per informazioni dettagliate, consulta il riferimento all'API SQLite Wasm. Ti ricordiamo che devi accedere a SQLite Wasm da un worker se utilizzi il file system privato di origine come backend di archiviazione.

Fai una prova

Questa demo ti consente di completare un database SQL web con dati di esempio, quindi esegue il dump dei dati SQL web sotto forma di istruzioni SQL, che vengono poi importate in SQLite Wasm supportate dal file system privato di origine. Infine, puoi liberare spazio di archiviazione eliminando i dati SQL web obsoleti. Controlla il codice sorgente per l'implementazione completa, incluso il file mywebsqldump.js patchato.

L&#39;app demo all&#39;indirizzo web-sql-to-sqlite-wasm.glitch.me.

Conclusioni

La migrazione dei database Web SQL a SQLite Wasm supportata dal file system privato di origine è possibile in modo trasparente per gli utenti. Non noteranno che i loro dati ora sono ospitati nel file system privato di origine in un database SQLite e non sono più in Web SQL. Nel complesso, la migrazione da SQL web a SQLite è un passaggio necessario per gli sviluppatori web che vogliono garantire la stabilità e la scalabilità a lungo termine delle loro applicazioni. Sebbene il processo possa richiedere uno sforzo iniziale, i vantaggi di una soluzione di database più solida, flessibile e, soprattutto, a prova di futuro fanno sì che l'investimento venga fatto bene.