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

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

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

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

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

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

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

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

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

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

استكشاف ملف mydatabase.db في أداة Sqlime SQLite Playground يظهر التطبيق مع طلب بحث SQL "اختيار نجمة من العواصف المطيرة" الحد 10، وهو ما يؤدي إلى إنشاء الصفوف الثلاثة من عينة البيانات الأولية من SQL على الويب.

تفريغ مساحة تخزين SQL على الويب

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

تجربة الميزة

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

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

الاستنتاجات

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