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

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

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

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

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

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

قواعد بيانات لغة الاستعلامات البنيوية(SQL) على الويب التي سيتم نقلها

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

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

ترجمة قاعدة بيانات SQL على الويب إلى عبارات SQL

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

فحص نظام الملفات الخاصة المصدر باستخدام "أدوات مطوري البرامج في Chrome" في OPFS Explorer هناك ملفّان، أحدهما يُسمى 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، ولم تعد موجودة في لغة الاستعلامات البنيوية (SQL) على الويب. بشكل عام، فإنّ نقل البيانات من Web SQL إلى SQLite هو خطوة ضرورية لمطوّري الويب الذين يريدون ضمان استقرار تطبيقاتهم وقابليتها للتوسع على المدى الطويل. وفي حين أن العملية قد تتطلب بعض الجهد الأولي، فإن فوائد استخدام حل قاعدة بيانات أكثر قوة ومرونة وقبل كل شيء يجعله مستجدًا في المستقبل،