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

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

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

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

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

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

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

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

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

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

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

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

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

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

वेब एसक्यूएल स्टोरेज खाली करना

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

इसका परीक्षण करें

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

इसका डेमो ऐप्लिकेशन, web-sql-to-sqlite-vasm.glitch.me पर उपलब्ध है.

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

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