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

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

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

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

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

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

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

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

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

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

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

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

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

تجربة الميزة

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

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

الاستنتاجات

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