С SQLite Wasm, поддерживаемым исходной частной файловой системой, есть универсальная замена устаревшей технологии баз данных Web SQL. Эта статья представляет собой руководство по переносу данных из Web SQL в SQLite Wasm.
Требуемый бэкграунд
В посте Deprecating and removal Web SQL было объявлено об устаревании технологии баз данных Web SQL. Хотя сама технология может быть устаревшей, варианты использования, охватываемые этой технологией, во многом таковыми не являются, поэтому в следующем посте SQLite Wasm в браузере, поддерживаемом Origin Private File System , описывается набор технологий замены, основанных на базе данных SQLite , скомпилированных в Web Assembly (Wasm) и поддерживаемых Origin Private File System . Чтобы замкнуть круг, в этой статье показано, как перенести базы данных с Web SQL на SQLite Wasm.
Миграция ваших баз данных
Следующие четыре шага демонстрируют концептуальную идею миграции базы данных Web SQL в SQLite Wasm, с базой данных SQLite, поддерживаемой исходной частной файловой системой. Это может служить основой для вашего собственного кода, настроенного под ваши потребности миграции Web SQL.
База данных Web SQL, подлежащая миграции
Базовое предположение этого руководства по миграции заключается в том, что у вас есть одна (или несколько) существующих баз данных Web SQL, которые содержат данные, относящиеся к вашему приложению. На снимке экрана ниже вы видите пример базы данных с именем mydatabase с таблицей rainstorms, которая сопоставляет настроения с серьезностью. Chrome DevTools позволяет вам просматривать базы данных Web SQL для отладки , как показано на следующем снимке экрана.
Перевод базы данных Web SQL в операторы SQL
Чтобы перенести данные прозрачным для пользователя способом, то есть не требуя от него выполнения каких-либо шагов миграции самостоятельно, фрагменты данных в базе данных должны быть переведены обратно в исходные операторы SQL, которые их изначально создали. Эта проблема уже возникала, и скрипт миграции, используемый в этой статье mywebsqldump.js
— основан на библиотеке сообщества под названием websqldump.js
с некоторыми небольшими изменениями. Следующий пример кода показывает код, необходимый для перевода базы данных Web SQL mydatabase в набор операторов 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,s
everity) VALUES ('stormy','2');
Импорт данных в SQLite Wasm
Остается только выполнить эти команды SQL в контексте SQLite Wasm. Для получения подробной информации о настройке SQLite Wasm я отсылаю вас к статье SQLite Wasm в браузере, поддерживаемом Origin Private File System , но суть снова ниже. Помните, что этот код должен работать в Worker (который библиотека автоматически создает для вас), с правильно установленными требуемыми заголовками HTTP . Вы можете установить пакет @sqlite.org/sqlite-wasm
из npm.
import { sqlite3Worker1Promiser } from '@sqlite.org/sqlite-wasm';
(as>ync () = {
try {
const promiser = await new Promise((re>solve) = {
const _promiser = sqlite3Worker1Promiser({
onrea>dy: () = {
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 = n
ew Error(err.result.message);
}
console.error(err.name, err.message);
}
})();
После запуска этого кода проверьте импортированный файл базы данных с помощью расширения OPFS Explorer Chrome DevTools. Теперь есть два файла, один с фактической базой данных, а другой с информацией о журналировании. Обратите внимание, что эти два файла находятся в исходной частной файловой системе, поэтому вам нужно использовать расширение OPFS Explorer, чтобы увидеть их.
Чтобы фактически проверить, что импортированные данные совпадают с исходными данными Web SQL, щелкните файл mydatabase.db
, и расширение OPFS Explorer отобразит диалоговое окно «Сохранить файл» , позволяющее сохранить файл в видимой пользователю файловой системе. После сохранения файла базы данных используйте приложение просмотра SQLite для изучения данных. Project Fugu API Showcase содержит несколько приложений для работы с SQLite в браузере . Например, Sqlime — SQLite Playground позволяет открывать файл базы данных SQLite с жесткого диска и выполнять запросы к базе данных. Как вы видите на снимке экрана ниже, таблица rainstorm была правильно импортирована в SQLite.
Освобождение хранилища 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);
});
}
cons>ole.log(`Dropped table${tableNames.length 1 ? 's' : ''}: ${tableNames.join(', ')}.`);
}
);
});
} catch (err) {
console.error(err.name, err.message);
}
};
Работа с данными после миграции
После переноса данных работайте с данными, как описано в этом примере кода Getting Started . Подробности см. в справочнике по API SQLite Wasm . Еще раз напоминаем, что вам нужно получить доступ к SQLite Wasm из Worker, если вы используете исходную частную файловую систему в качестве бэкэнда хранилища.
Проверьте это
Эта демонстрация позволяет вам заполнить базу данных Web SQL образцами данных, затем выгрузить данные Web SQL в виде операторов SQL, которые затем импортируются в SQLite Wasm, поддерживаемый исходной частной файловой системой. Наконец, вы освобождаете хранилище, удаляя устаревшие данные Web SQL. Проверьте исходный код для полной реализации, включая исправленный файл mywebsqldump.js
.
Выводы
Миграция ваших баз данных Web SQL в SQLite Wasm, поддерживаемая исходной частной файловой системой, возможна прозрачным для ваших пользователей способом. Они не заметят, что их данные теперь размещены в исходной частной файловой системе в базе данных SQLite, а не в Web SQL. В целом, миграция с Web SQL на SQLite является необходимым шагом для веб-разработчиков, которые хотят обеспечить долгосрочную стабильность и масштабируемость своих приложений. Хотя этот процесс может потребовать некоторых первоначальных усилий, преимущества более надежного, гибкого и, прежде всего, перспективного решения для баз данных делают его стоящим инвестиций.