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

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

थॉमस स्टेनर
थॉमस स्टेनर

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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