من 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 التي سيتم نقلها

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

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

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

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

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