Web SQL से SQLite Wasm तक: डेटाबेस माइग्रेशन गाइड

SQLite Wasm, ऑरिजिनल निजी फ़ाइल सिस्टम के साथ काम करता है. यह वेब एसक्यूएल डेटाबेस टेक्नोलॉजी की जगह ले सकता है. इस लेख में, अपने डेटा को Web SQL से SQLite Wasm पर माइग्रेट करने का तरीका बताया गया है.

ज़रूरी बैकग्राउंड

Web SQL को बंद करना और हटाना पोस्ट में, Web SQL डेटाबेस टेक्नोलॉजी के बंद होने का एलान किया गया था. हालांकि, इस टेक्नोलॉजी का इस्तेमाल अब नहीं किया जा सकता, लेकिन इस टेक्नोलॉजी के इस्तेमाल के उदाहरण अब भी काम के हैं. इसलिए, ब्राउज़र में SQLite Wasm, जो Origin के निजी फ़ाइल सिस्टम के साथ काम करता है पोस्ट में, SQLite डेटाबेस के आधार पर, टेक्नोलॉजी के बदले इस्तेमाल किए जा सकने वाले सेट के बारे में बताया गया है. यह डेटाबेस, वेब असेंबली (Wasm) में कंपाइल किया गया है और Origin के निजी फ़ाइल सिस्टम के साथ काम करता है. इस लेख में, डेटाबेस को Web SQL से SQLite Wasm पर माइग्रेट करने का तरीका बताया गया है.

डेटाबेस माइग्रेट करना

यहां दिए गए चार चरणों में, वेब एसक्यूएल डेटाबेस को SQLite Wasm पर माइग्रेट करने के कॉन्सेप्ट के बारे में बताया गया है. इसमें, SQLite डेटाबेस को ऑरिजिनल निजी फ़ाइल सिस्टम से बैकअप किया गया है. यह आपके Web SQL माइग्रेशन की ज़रूरतों के मुताबिक बनाए गए आपके कोड के लिए, बुनियाद के तौर पर काम कर सकता है.

माइग्रेट किए जाने वाले वेब एसक्यूएल डेटाबेस

माइग्रेशन गाइड के आधार पर यह माना जाता है कि आपके पास एक या उससे ज़्यादा वेब SQL डेटाबेस मौजूद हैं, जिनमें आपके ऐप्लिकेशन से जुड़ा डेटा सेव है. नीचे दिए गए स्क्रीनशॉट में, mydatabase नाम का एक डेटाबेस का उदाहरण दिया गया है. इसमें बारिश की टेबल है, जो मौसम की स्थिति को बारिश की तीव्रता के हिसाब से मैप करती है. Chrome DevTools आपको डीबग करने के लिए Web SQL डेटाबेस देखने की अनुमति देता है, जैसा कि इस स्क्रीनशॉट में दिखाया गया है.

Chrome के DevTools में जांचा गया वेब SQL डेटाबेस. इस डेटाबेस का नाम mydatabase है. इसमें तीन कॉलम वाली टेबल होस्ट की जाती है: पंक्ति आईडी, मूड, और गंभीरता. सैंपल डेटा की तीन लाइनें हैं.

वेब एसक्यूएल डेटाबेस का एसक्यूएल स्टेटमेंट में अनुवाद करना

डेटा को उपयोगकर्ता के लिए पारदर्शी तरीके से माइग्रेट करने के लिए, डेटाबेस में मौजूद डेटा के हिस्सों को उन ओरिजनल SQL स्टेटमेंट में वापस अनुवाद करना होगा जिनसे उन्हें बनाया गया था. इससे, उपयोगकर्ता को माइग्रेशन के किसी भी चरण को खुद पूरा करने की ज़रूरत नहीं पड़ेगी. यह समस्या पहले भी आ चुकी है. इस लेख में इस्तेमाल की गई माइग्रेशन स्क्रिप्ट—mywebsqldump.jswebsqldump.js नाम की कम्यूनिटी लाइब्रेरी पर आधारित है. इसमें कुछ छोटे बदलाव किए गए हैं. नीचे दिया गया कोड सैंपल, वेब एसक्यूएल डेटाबेस mydatabase को एसक्यूएल स्टेटमेंट के सेट में अनुवाद करने के लिए ज़रूरी कोड दिखाता है.

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 में डेटा इंपोर्ट करना

अब बस SQLite Wasm के संदर्भ में इन SQL कमांड को लागू करना बाकी है. SQLite Wasm को सेट अप करने के बारे में पूरी जानकारी के लिए, हम आपको ऑरिजिन प्राइवेट फ़ाइल सिस्टम के साथ काम करने वाले ब्राउज़र में SQLite Wasm का इस्तेमाल करें लेख पढ़ें. हालांकि, यहां मुख्य जानकारी दोबारा दी गई है. ध्यान रखें कि इस कोड को किसी वर्कर्स में चलाना ज़रूरी है. यह वर्कर्स, लाइब्रेरी आपके लिए अपने-आप बनाती है. साथ ही, इसमें ज़रूरी एचटीटीपी हेडर सही तरीके से सेट होने चाहिए. npm से @sqlite.org/sqlite-wasm पैकेज इंस्टॉल किया जा सकता है.

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 एक्सप्लोरर Chrome DevTools एक्सटेंशन की मदद से, इंपोर्ट की गई डेटाबेस फ़ाइल की जांच करें. अब दो फ़ाइलें हैं, एक वास्तविक डेटाबेस वाली और दूसरी जर्नलिंग जानकारी वाली. ध्यान दें कि ये दोनों फ़ाइलें, ओरिजिनल निजी फ़ाइल सिस्टम में मौजूद होती हैं. इसलिए, इन्हें देखने के लिए आपको OPFS एक्सप्लोरर एक्सटेंशन का इस्तेमाल करना होगा.

OPFS एक्सप्लोरर Chrome DevTools की मदद से, ओरिजिनल निजी फ़ाइल सिस्टम की जांच करना. दो फ़ाइलें हैं, जिनमें से एक का नाम mydatabase.db है और दूसरी का नाम mydatabase.db-journal है.

इंपोर्ट किए गए डेटा और शुरुआती वेब SQL डेटा की पुष्टि करने के लिए, फ़ाइल mydatabase.db पर क्लिक करें. इसके बाद, OPFS एक्सप्लोरर एक्सटेंशन आपको फ़ाइल सेव करें डायलॉग दिखाएगा. इसकी मदद से, फ़ाइल को उपयोगकर्ता के लिए दिखने वाले फ़ाइल सिस्टम में सेव किया जा सकता है. डेटाबेस फ़ाइल सेव होने के बाद, डेटा को एक्सप्लोर करने के लिए SQLite व्यूअर ऐप्लिकेशन का इस्तेमाल करें. Project Fugu API Showcase में, ब्राउज़र में SQLite के साथ काम करने के लिए कई ऐप्लिकेशन मौजूद हैं. उदाहरण के लिए, Sqlime — SQLite Playground की मदद से, अपनी हार्ड डिस्क से SQLite डेटाबेस फ़ाइल खोली जा सकती है और डेटाबेस पर क्वेरी चलाई जा सकती हैं. जैसा कि नीचे दिए गए स्क्रीनशॉट में देखा जा सकता है, बारिश की टेबल को SQLite में सही तरीके से इंपोर्ट किया गया है.

Sqlime SQLite Playground टूल में mydatabase.db फ़ाइल को एक्सप्लोर करना. इस ऐप्लिकेशन को, SQL क्वेरी 'सिलेक्ट स्टार' के साथ दिखाया गया है. इसमें, रेनफ़ॉल स्टॉर्म की सीमा 10 का इस्तेमाल किया गया है. इस वजह से, वेब एसक्यूएल के शुरुआती सैंपल डेटा से तीन लाइनें बन जाती हैं.

Web SQL का स्टोरेज खाली करना

वेब एसक्यूएल डेटाबेस को मिटाना शायद आपको आश्चर्यजनक लगे, लेकिन यह मुमकिन नहीं है. हालांकि, डेटा को SQLite Wasm में माइग्रेट करने के बाद, अब काम न करने वाली वेब एसक्यूएल टेबल को हटाकर, कुछ स्टोरेज खाली किया जा सकता है. वेब एसक्यूएल डेटाबेस में सभी टेबल की सूची बनाने और उन्हें 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 API का रेफ़रंस देखें. आपको यह याद दिला दें कि अगर स्टोरेज बैकएंड के तौर पर ऑरिजिन प्राइवेट फ़ाइल सिस्टम का इस्तेमाल किया जाता है, तो आपको Worker से SQLite Wasm को ऐक्सेस करना होगा.

इसे आज़माएं

इस डेमो की मदद से, वेब एसक्यूएल डेटाबेस को सैंपल डेटा से भरा जा सकता है. इसके बाद, वेब एसक्यूएल डेटा को एसक्यूएल स्टेटमेंट के तौर पर डंप किया जाता है. इसके बाद, यह ऑरिजिन प्राइवेट फ़ाइल सिस्टम के साथ SQLite Wasm के साथ इंपोर्ट किया जाता है. आखिर में, वेब एसक्यूएल का पुराना डेटा मिटाकर, स्टोरेज खाली किया जाता है. पूरी तरह लागू करने के बारे में जानने के लिए, सोर्स कोड की जांच करें. इसमें, पैच की गई mywebsqldump.js फ़ाइल भी शामिल है.

web-sql-to-sqlite-wasm.glitch.me पर मौजूद डेमो ऐप्लिकेशन.

मीटिंग में सामने आए नतीजे

अपने वेब एसक्यूएल डेटाबेस को, ऑरिजिनल निजी फ़ाइल सिस्टम के साथ काम करने वाले SQLite Wasm पर माइग्रेट किया जा सकता है. ऐसा करने पर, उपयोगकर्ताओं को कोई परेशानी नहीं होती. उन्हें पता नहीं चलेगा कि उनका डेटा अब ऑरिजिनल निजी फ़ाइल सिस्टम में SQLite डेटाबेस में होस्ट किया जा रहा है और अब वेब SQL में नहीं है. कुल मिलाकर, उन वेब डेवलपर के लिए Web SQL से SQLite पर माइग्रेट करना ज़रूरी कदम है, जो अपने ऐप्लिकेशन की लंबे समय तक स्थिरता और बढ़ाए जा सकने की योग्यता पक्का करना चाहते हैं. हालांकि, इस प्रक्रिया में कुछ शुरुआती कोशिश करनी पड़ सकती है, लेकिन ज़्यादा मज़बूत, सुविधाजनक, और भविष्य में इस्तेमाल होने वाला डेटाबेस समाधान के फ़ायदे, इस पर निवेश करने के लिए काफ़ी फ़ायदेमंद साबित होते हैं.