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

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

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

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

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

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

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

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

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

Web SQL डेटाबेस को SQL स्टेटमेंट में बदलना

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

इसे आज़माएं

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

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

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

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