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

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

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

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

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

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

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

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

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

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

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