От Web SQL к SQLite Wasm: руководство по миграции базы данных

SQLite Wasm, поддерживаемый исходной частной файловой системой, представляет собой универсальную замену устаревшей технологии баз данных Web SQL. Эта статья представляет собой руководство по переносу данных из Web SQL в SQLite Wasm.

Требуемый фон

В публикации «Устаревание и удаление Web SQL» объявлено об устаревании технологии баз данных Web SQL. Хотя сама технология может быть устаревшей, варианты ее использования во многом не таковы, поэтому в последующем сообщении SQLite Wasm в браузере, поддерживаемом частной файловой системой Origin , описывается набор технологий на замену, основанный на базе данных SQLite . , скомпилированный в Web Assembly (Wasm) и поддерживаемый исходной частной файловой системой . Чтобы замкнуть круг, в этой статье показано, как перенести базы данных с Web SQL на SQLite Wasm.

Миграция ваших баз данных

Следующие четыре шага демонстрируют концептуальную идею миграции базы данных Web SQL на SQLite Wasm, при этом база данных SQLite поддерживается исходной частной файловой системой. Это может послужить основой для вашего собственного кода, адаптированного к вашим потребностям миграции Web SQL.

Базы данных Web SQL, подлежащие переносу.

Базовое предположение этого руководства по миграции заключается в том, что у вас есть одна (или несколько) существующих баз данных Web SQL, в которых хранятся данные, относящиеся к вашему приложению. На снимке экрана ниже вы видите пример базы данных под названием mydatabase с таблицей ливней, которая сопоставляет настроение с серьезностью. Инструменты разработчика Chrome позволяют просматривать базы данных Web SQL для отладки , как показано на следующем снимке экрана.

База данных Web SQL, проверенная в Chrome DevTools. База данных называется mydatabase и содержит таблицу с тремя столбцами: идентификатор строки, настроение и серьезность. Имеется три строки выборочных данных.

Перевод базы данных Web SQL в операторы SQL

Чтобы перенести данные прозрачным для пользователя способом, то есть не требуя от него выполнения каких-либо шагов миграции самостоятельно, фрагменты данных в базе данных необходимо преобразовать обратно в исходные операторы SQL, которые создали их в первую очередь. Эта проблема уже возникала раньше, и сценарий миграции, используемый в этой статье — mywebsqldump.js — основан на библиотеке сообщества под названием websqldump.js с некоторыми небольшими изменениями. В следующем примере кода показан код, необходимый для преобразования базы данных mydatabase Web SQL в набор операторов SQL.

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

Результатом выполнения этого кода является строка операторов 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');

Импорт данных в SQLite Wasm

Остается только выполнить эти команды SQL в контексте SQLite Wasm. За всеми подробностями о настройке SQLite Wasm я отсылаю вас к статье SQLite Wasm в браузере, поддерживаемом частной файловой системой Origin , но суть снова приведена ниже. Помните, что этот код должен запускаться в Worker (который библиотека автоматически создает для вас) с правильно установленными необходимыми заголовками HTTP . Вы можете установить пакет @sqlite.org/sqlite-wasm из 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);
  }
})();

После запуска этого кода проверьте импортированный файл базы данных с помощью расширения OPFS Explorer Chrome DevTools. Теперь есть два файла: один с фактической базой данных, а другой с информацией журнала. Обратите внимание, что эти два файла находятся в исходной частной файловой системе, поэтому для их просмотра вам необходимо использовать расширение OPFS Explorer.

Проверка исходной частной файловой системы с помощью OPFS Explorer Chrome DevTools. Существует два файла: один называется mydatabase.db, а другой — mydatabase.db-journal.

Чтобы действительно убедиться, что импортированные данные совпадают с исходными данными Web SQL, щелкните файл mydatabase.db , и расширение OPFS Explorer отобразит диалоговое окно «Сохранить файл» , позволяющее сохранить файл в видимой пользователю файловой системе. Сохранив файл базы данных, используйте приложение просмотра SQLite для изучения данных. В программе Project Fugu API представлено несколько приложений для работы с SQLite в браузере . Например, Sqlime — SQLite Playground позволяет открыть файл базы данных SQLite с жесткого диска и выполнять запросы к базе данных. Как вы видите на скриншоте ниже, таблица Rainstorm была правильно импортирована в SQLite.

Изучение файла mydatabase.db в инструменте Sqlime SQLite Playground. Приложение показано с выполняемым SQL-запросом select star из Rainstorms Limit 10, в результате чего появляются три строки из исходного образца данных из Web SQL.

Освобождение хранилища Web SQL

Хотя (возможно, это удивительно) невозможно удалить базу данных Web SQL , вам все равно следует освободить место для хранения, удалив устаревшие таблицы Web SQL после переноса данных в SQLite Wasm. Чтобы составить список всех таблиц в базе данных Web SQL и удалить их с помощью JavaScript, используйте код, как показано в следующем фрагменте:

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

Работа с данными после миграции

После переноса данных работайте с ними, как описано в этом примере кода для начала работы . Подробности см. в справочнике по SQLite Wasm API . Еще раз напоминаем, что вам необходимо получить доступ к SQLite Wasm из Worker, если вы используете исходную частную файловую систему в качестве серверной части хранилища.

Проверьте это

Эта демонстрация позволяет заполнить базу данных Web SQL примерами данных, а затем выгрузить данные Web SQL в виде операторов SQL, которые затем импортируются в SQLite Wasm, поддерживаемый исходной частной файловой системой. Наконец, вы освобождаете хранилище, удаляя устаревшие данные Web SQL. Проверьте исходный код на наличие полной реализации, включая исправленный файл mywebsqldump.js .

Демо-приложение на веб-sql-to-sqlite-wasm.glitch.me.

Выводы

Миграция ваших баз данных Web SQL в SQLite Wasm, поддерживаемая исходной частной файловой системой, возможна прозрачным для ваших пользователей способом. Они не заметят, что их данные теперь размещаются в исходной частной файловой системе в базе данных SQLite и больше не находятся в Web SQL. В целом, переход с Web SQL на SQLite — необходимый шаг для веб-разработчиков, которые хотят обеспечить долгосрочную стабильность и масштабируемость своих приложений. Хотя этот процесс может потребовать некоторых первоначальных усилий, преимущества более надежного, гибкого и, прежде всего, перспективного решения для баз данных оправдывают вложения в него.