Avec SQLite Wasm, qui est compatible avec le système de fichiers privé d'origine, vous disposez d'un remplacement polyvalent de la technologie de base de données Web SQL obsolète. Cet article explique comment migrer vos données de Web SQL vers SQLite Wasm.
Exigences concernant le profil
L'article Abandon et suppression de Web SQL a annoncé l'abandon de la technologie de base de données Web SQL. Bien que la technologie elle-même puisse être abandonnée, les cas d'utilisation qu'elle gère ne le sont pas. Le post de suivi SQLite Wasm dans le navigateur, compatible avec le système de fichiers privés d'origine décrit un ensemble de technologies de remplacement basé sur la base de données SQLite, compilée en WebAssembly (Wasm) et compatible avec le système de fichiers privés d'origine. Pour boucler la boucle, cet article explique comment migrer des bases de données de Web SQL vers SQLite Wasm.
Migrer vos bases de données
Les quatre étapes suivantes illustrent l'idée conceptuelle de migrer une base de données Web SQL vers SQLite Wasm, la base de données SQLite étant prise en charge par le système de fichiers privé d'origine. Vous pouvez vous en servir comme base pour votre propre code personnalisé en fonction de vos besoins de migration SQL Web.
La ou les bases de données Web SQL à migrer
Ce guide de migration part du principe que vous disposez d'une (ou de plusieurs) base de données Web SQL existante contenant des données pertinentes pour votre application. Dans la capture d'écran ci-dessous, vous voyez un exemple de base de données appelée mydatabase avec une table "orages" qui met en correspondance les humeurs avec les intensités. Les outils pour les développeurs Chrome vous permettent d'afficher des bases de données WebSQL à des fins de débogage, comme illustré dans la capture d'écran suivante.
Traduire la base de données Web SQL en instructions SQL
Pour migrer les données de manière transparente pour l'utilisateur, c'est-à-dire sans qu'il ait à effectuer lui-même les étapes de migration, les éléments de données de la base de données doivent être traduits en instructions SQL d'origine qui les ont créés. Ce problème s'est déjà posé, et le script de migration utilisé dans cet article (mywebsqldump.js
) est basé sur une bibliothèque de la communauté appelée websqldump.js
, avec quelques ajustements mineurs. L'exemple de code suivant montre le code requis pour traduire la base de données Web SQL mydatabase en un ensemble d'instructions SQL.
websqldump.export({
database: 'mydatabase',
version: '1.0',
success: function(sql) {
// The SQL statements.
},
error: function(err) {
// Handle the error.
}
});
L'exécution de ce code génère la chaîne d'instructions SQL ci-dessous.
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');
Importer les données dans SQLite Wasm
Il ne reste plus qu'à exécuter ces commandes SQL dans le contexte de SQLite Wasm. Pour en savoir plus sur la configuration de SQLite Wasm, consultez l'article SQLite Wasm dans le navigateur, avec le système de fichiers privé Origin. Vous trouverez ci-dessous un résumé. N'oubliez pas que ce code doit s'exécuter dans un worker (que la bibliothèque crée automatiquement pour vous), avec les en-têtes HTTP requis correctement définis. Vous pouvez installer le package @sqlite.org/sqlite-wasm
à partir de 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);
}
})();
Après avoir exécuté ce code, inspectez le fichier de base de données importé à l'aide de l'extension OPFS Explorer des outils pour les développeurs Chrome. Il existe désormais deux fichiers, l'un contenant la base de données réelle et l'autre des informations de journalisation. Notez que ces deux fichiers se trouvent dans le système de fichiers privé d'origine. Vous devez donc utiliser l'extension OPFS Explorer pour les afficher.
Pour vérifier que les données importées sont identiques aux données SQL Web initiales, cliquez sur le fichier mydatabase.db
. L'extension OPFS Explorer affiche alors une boîte de dialogue Enregistrer le fichier pour vous permettre d'enregistrer le fichier dans le système de fichiers visible par l'utilisateur. Une fois le fichier de base de données enregistré, utilisez une application de visionneuse SQLite pour explorer les données. La présentation des API du projet Fugu propose plusieurs applications permettant de travailler avec SQLite dans le navigateur. Par exemple, Sqlime — SQLite Playground vous permet d'ouvrir un fichier de base de données SQLite à partir de votre disque dur et d'exécuter des requêtes sur la base de données. Comme vous pouvez le voir dans la capture d'écran ci-dessous, la table "rainstorm" a été correctement importée dans SQLite.
Libérer l'espace de stockage Web SQL
Bien qu'il soit (peut-être de façon surprenante) impossible de supprimer une base de données Web SQL, vous devez tout de même libérer de l'espace de stockage en supprimant les tables Web SQL obsolètes après avoir migré les données vers SQLite Wasm. Pour lister toutes les tables d'une base de données SQL Web et les supprimer à l'aide de JavaScript, utilisez le code de l'extrait suivant:
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);
}
};
Utiliser les données après la migration
Une fois les données migrées, utilisez-les comme indiqué dans cet exemple de code de démarrage. Pour en savoir plus, consultez la documentation de référence de l'API SQLite Wasm. Pour rappel, vous devez accéder à SQLite Wasm à partir d'un nœud de calcul si vous utilisez le système de fichiers privé d'origine comme backend de stockage.
Effectuer un test
Cette démo vous permet de renseigner une base de données Web SQL avec des exemples de données, puis de vider les données Web SQL sous forme d'instructions SQL, qui sont ensuite importées dans SQLite Wasm, qui est pris en charge par le système de fichiers privé d'origine. Enfin, vous libérez de l'espace de stockage en supprimant les données SQL Web obsolètes. Consultez le code source pour obtenir l'implémentation complète, y compris le fichier mywebsqldump.js
corrigé.
Conclusions
Vous pouvez migrer vos bases de données SQL Web vers SQLite Wasm, qui est compatible avec le système de fichiers privé d'origine, de manière transparente pour vos utilisateurs. Ils ne remarqueront pas que leurs données sont désormais hébergées dans le système de fichiers privé d'origine dans une base de données SQLite et qu'elles ne résident plus dans Web SQL. Dans l'ensemble, la migration de Web SQL vers SQLite est une étape nécessaire pour les développeurs Web qui souhaitent assurer la stabilité et l'évolutivité à long terme de leurs applications. Bien que le processus puisse nécessiter un certain effort initial, les avantages d'une solution de base de données plus robuste, flexible et, surtout, évolutive en font un investissement rentable.