از Web SQL به SQLite Wasm: راهنمای انتقال پایگاه داده

با پشتیبانی SQLite Wasm توسط سیستم فایل خصوصی مبدا، جایگزینی همه کاره برای فناوری پایگاه داده منسوخ وب SQL وجود دارد. این مقاله راهنمای انتقال داده های شما از Web SQL به SQLite Wasm است.

پس زمینه مورد نیاز

پست منسوخ شدن و حذف Web SQL از بی اعتبار شدن فناوری پایگاه داده Web SQL خبر داد. در حالی که ممکن است خود این فناوری منسوخ شده باشد، موارد استفاده که توسط فناوری مورد توجه قرار می‌گیرد بسیار مورد توجه قرار نمی‌گیرد، بنابراین پست بعدی SQLite Wasm در مرورگری که توسط Origin Private File System پشتیبانی می‌شود ، مجموعه‌ای از فناوری‌های جایگزین مبتنی بر پایگاه داده SQLite را تشریح می‌کند. ، در Web Assembly (Wasm) کامپایل شده و توسط سیستم فایل خصوصی مبدا پشتیبانی می شود. برای بستن دایره، این مقاله نحوه انتقال پایگاه های داده از Web SQL به SQLite Wasm را نشان می دهد.

مهاجرت پایگاه داده شما

چهار مرحله زیر ایده مفهومی انتقال پایگاه داده Web SQL به SQLite Wasm را با پایگاه داده SQLite که توسط سیستم فایل خصوصی مبدا پشتیبانی می شود، نشان می دهد. این می تواند به عنوان پایه ای برای کد شخصی شما که مطابق با نیازهای مهاجرت وب SQL شما است، عمل کند.

پایگاه داده(های) Web SQL که قرار است منتقل شود

فرض اصلی این راهنمای مهاجرت این است که شما یک (یا چند) پایگاه داده وب SQL موجود دارید که داده های مربوط به برنامه شما را نگه می دارد. در اسکرین شات زیر، یک پایگاه داده نمونه به نام mydatabase را با جدول باران طوفان می بینید که حالت ها را به شدت ترسیم می کند. Chrome DevTools به شما امکان می دهد پایگاه داده های Web SQL را برای اشکال زدایی مشاهده کنید ، همانطور که در تصویر زیر نشان داده شده است.

پایگاه داده Web SQL که در DevTools Chrome بازرسی شده است. پایگاه داده mydatabase نام دارد و میزبان یک جدول با سه ستون است: ID ردیف، حالت و شدت. سه ردیف داده نمونه وجود دارد.

ترجمه پایگاه داده وب 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 پشتیبانی می شود ارجاع می دهم، اما اصل مطلب دوباره در زیر آمده است. به یاد داشته باشید که این کد باید در 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 DevTools بررسی کنید. اکنون دو فایل وجود دارد، یکی با پایگاه داده واقعی و دیگری با اطلاعات ژورنال. توجه داشته باشید که این دو فایل در سیستم فایل خصوصی مبدا زندگی می کنند، بنابراین برای مشاهده آنها باید از پسوند OPFS Explorer استفاده کنید.

بازرسی سیستم فایل خصوصی مبدا با ابزار توسعه کروم OPFS Explorer. دو فایل وجود دارد، یکی به نام mydatabase.db و دیگری به نام mydatabase.db-journal.

برای اینکه واقعاً تأیید کنید که داده‌های وارد شده مشابه داده‌های اولیه Web SQL هستند، روی فایل mydatabase.db کلیک کنید و پسوند OPFS Explorer یک گفتگوی Save File را نشان می‌دهد تا به شما امکان می‌دهد فایل را در سیستم فایل قابل مشاهده کاربر ذخیره کنید. با ذخیره فایل پایگاه داده، از یک برنامه نمایشگر SQLite برای کاوش داده ها استفاده کنید. Project Fugu API Showcase دارای چندین برنامه برای کار با SQLite در مرورگر است. به عنوان مثال، Sqlime — SQLite Playground به شما امکان می دهد یک فایل پایگاه داده SQLite را از دیسک سخت خود باز کنید و پرس و جوهایی را در پایگاه داده اجرا کنید. همانطور که در تصویر زیر مشاهده می کنید، جدول rainstorm به درستی به SQLite وارد شده است.

کاوش فایل mydatabase.db در ابزار Sqlime SQLite Playground. این برنامه با پرس و جوی SQL نشان داده می شود که ستاره انتخاب شده از حد 10 در حال اجرا است، که منجر به ایجاد سه ردیف از داده های نمونه اولیه از Web SQL می شود.

آزاد کردن فضای ذخیره سازی وب SQL

در حالی که حذف یک پایگاه داده Web SQL غیرممکن است (شاید به طرز شگفت انگیزی)، شما همچنان باید با حذف جداول Web SQL که اکنون منسوخ شده اند، پس از انتقال داده ها به SQLite Wasm، مقداری فضای ذخیره سازی آزاد کنید. برای فهرست کردن همه جداول در پایگاه داده Web SQL و رها کردن آنها با استفاده از جاوا اسکریپت، از کدی مانند قطعه زیر استفاده کنید:

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 وارد می شود. در نهایت، با حذف داده های Web SQL منسوخ شده، فضای ذخیره سازی را آزاد می کنید. کد منبع را برای اجرای کامل، از جمله فایل اصلاح شده mywebsqldump.js بررسی کنید.

برنامه آزمایشی در web-sql-to-sqlite-wasm.glitch.me.

نتیجه گیری

انتقال پایگاه های داده وب SQL شما به SQLite Wasm که توسط سیستم فایل خصوصی مبدا پشتیبانی می شود، به گونه ای شفاف برای کاربران شما امکان پذیر است. آنها متوجه نمی شوند که داده های آنها اکنون در سیستم فایل خصوصی اصلی در پایگاه داده SQLite میزبانی می شود و دیگر در Web SQL زندگی نمی کند. به طور کلی، مهاجرت از Web SQL به SQLite یک گام ضروری برای توسعه دهندگان وب است که می خواهند از ثبات طولانی مدت و مقیاس پذیری برنامه های خود اطمینان حاصل کنند. در حالی که این فرآیند ممکن است به تلاش اولیه نیاز داشته باشد، مزایای یک راه حل پایگاه داده قوی تر، انعطاف پذیرتر و مهمتر از همه، آن را به ارزش سرمایه گذاری می رساند.