من Web SQL إلى SQLite Wasm: دليل نقل قاعدة البيانات

مع SQLite Wasm المتوافق مع نظام الملفات الخاص الأصلي، يتوفّر بديل متعدد الاستخدامات لتكنولوجيا قاعدة بيانات Web SQL المتوقّفة نهائيًا. هذه المقالة هي دليل لنقل بياناتك من لغة الاستعلامات البنيوية (SQL) على الويب إلى SQLite Wasm.

الخلفية المطلوبة

أعلنت المشاركة إيقاف Web SQL نهائيًا وإزالتها عن إيقاف تقنية قاعدة بيانات Web SQL نهائيًا. على الرغم من أنّ التكنولوجيا نفسها قد يتم إيقافها نهائيًا، إلا أنّ حالات الاستخدام التي تعالج هذه التكنولوجيا لا تزال قيد الاستخدام، لذا يوضّح القسم التالي من المقالة SQLite Wasm في المتصفّح مع ميزة "نظام الملفات الخاص بالمنشأ" مجموعة بديلة من التقنيات المستندة إلى قاعدة بيانات SQLite، والتي تم تجميعها باستخدام Web Assembly (Wasm) ومدعومة من نظام الملفات الخاص بالمنشأ. ولتوضيح الأمر بشكل كامل، توضِّح هذه المقالة كيفية نقل قواعد البيانات من لغة الاستعلامات البنيوية (SQL) على الويب إلى SQLite Wasm.

نقل قواعد البيانات

توضِّح الخطوات الأربع التالية الفكرة الأساسية لنقل قاعدة بيانات Web SQL إلى SQLite Wasm، مع الاحتفاظ بقاعدة بيانات SQLite في نظام الملفات الخاص الأصلي. يمكن أن يشكّل هذا الرمز الأساس لرمزك الخاص المخصّص لاحتياجات نقل بيانات قاعدة بيانات Web SQL.

قواعد بيانات Web SQL المطلوب نقلها

يستند دليل نقل البيانات هذا إلى افتراض أساسي وهو أنّ لديك قاعدة بيانات Web SQL حالية (أو عدة قواعد) تحتوي على بيانات ذات صلة بتطبيقك. في لقطة الشاشة أدناه، يظهر لك مثال على قاعدة بيانات باسم mydatabase تتضمّن جدول عواصف رعدية تربط بين حالات الطقس وشدتها. تتيح لك "أدوات مطوّري البرامج في Chrome" عرض قواعد بيانات WebSQL لتصحيح الأخطاء، كما هو موضّح في لقطة الشاشة التالية.

قاعدة بيانات Web SQL تم فحصها في "أدوات مطوّري البرامج" في Chrome تُسمى قاعدة البيانات mydatabase وتستضيف جدولاً يتضمّن ثلاثة أعمدة: رقم تعريف الصف والحالة المزاجية وشدة الشعور. هناك ثلاثة صفوف من نماذج البيانات.

ترجمة قاعدة بيانات 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,severity) 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';

(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". يتوفّر الآن ملفّان، أحدهما يتضمّن قاعدة البيانات الفعلية والآخر يتضمّن معلومات تسجيل دفتر اليومية. يُرجى العِلم أنّ هذين الملفَّين متوفّرين في نظام الملفات الخاص الأصلي، لذا عليك استخدام إضافة OPFS Explorer لعرضهما.

فحص نظام الملفات الخاص الأصلي باستخدام أداة OPFS Explorer في "أدوات مطوّري البرامج في Chrome" هناك ملفان، أحدهما يُسمى mydatabase.db والآخر يُسمى mydatabase.db-journal.

للتحقّق من أنّ البيانات التي تم استيرادها هي نفسها بيانات Web SQL الأولية، انقر على الملف mydatabase.db وستُظهر إضافة OPFS Explorer مربّع حوار حفظ الملف للسماح لك بحفظ الملف في نظام الملفات المرئي للمستخدم. بعد حفظ ملف قاعدة البيانات، استخدِم تطبيقًا لعرض SQLite لاستكشاف البيانات. يعرض Project Fugu API Showcase العديد من التطبيقات للعمل مع SQLite في المتصفّح. على سبيل المثال، تتيح لك أداة Sqlime - SQLite Playground فتح ملف قاعدة بيانات SQLite من القرص الصلب وتنفيذ طلبات بحث على قاعدة البيانات. كما هو موضّح في لقطة الشاشة أدناه، تم استيراد جدول العواصف الرعدية بشكل صحيح إلى SQLite.

استكشاف ملف mydatabase.db في أداة Sqlime SQLite Playground يظهر التطبيق مع تشغيل طلب البحث SQL select star from rainstorms limit 10، ما يؤدي إلى ظهور الصفوف الثلاثة من بيانات العيّنة الأولية من Web SQL.

تحرير مساحة التخزين في لغة الاستعلامات البنيوية (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 المستند إلى نظام الملفات الخاص الأصلي. أخيرًا، يمكنك إخلاء بعض مساحة التخزين من خلال حذف بيانات لغة الاستعلامات البنيوية (SQL) على الإنترنت القديمة. راجِع رمز المصدر للتنفيذ الكامل، بما في ذلك ملف mywebsqldump.js الذي تم تصحيحه.

التطبيق التجريبي على web-sql-to-sqlite-wasm.glitch.me

الاستنتاجات

يمكنك نقل قواعد بيانات Web SQL إلى SQLite Wasm المستندة إلى نظام الملفات الخاص الأصلي بطريقة شفافة للمستخدمين. ولن يلاحظ المستخدمون أنّ بياناتهم مستضافة الآن في نظام الملفات الخاص الأصلي في قاعدة بيانات SQLite، وأنّها لم تعُد متوفّرة في Web SQL. بشكل عام، فإنّ نقل البيانات من Web SQL إلى SQLite هو خطوة ضرورية لمطوّري الويب الذين يريدون ضمان استقرار تطبيقاتهم وقابليتها للتوسع على المدى الطويل. على الرغم من أنّ العملية قد تتطلّب بعض الجهد الأوّلي، إلا أنّ مزايا حلّ قاعدة بيانات أكثر أمانًا ومرونة وقابلية للاستخدام في المستقبل تجعل هذا الاستثمار جديًا.