ब्राउज़र में SQLite Wasm, जो ऑरिजिन प्राइवेट फ़ाइल सिस्टम के साथ काम करता है

वेब पर स्टोरेज की अपनी सभी ज़रूरतों को बेहतर तरीके से मैनेज करने के लिए, SQLite का इस्तेमाल करें.

SQLite के बारे में जानकारी

SQLite एक लोकप्रिय ओपन-सोर्स, लाइटवेट, एम्बेड किया गया रिलेशनल डेटाबेस मैनेजमेंट सिस्टम है. कई डेवलपर इसका इस्तेमाल, स्ट्रक्चर्ड और इस्तेमाल में आसान तरीके से डेटा स्टोर करने के लिए करते हैं. अपने छोटे साइज़ और कम मेमोरी की वजह से, SQLite का इस्तेमाल अक्सर मोबाइल डिवाइस, डेस्कटॉप ऐप्लिकेशन, और वेब ब्राउज़र में डेटाबेस इंजन के तौर पर किया जाता है.

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

SQLite का लोगो.

वेब असेंबली पर आधारित SQLite

वेब असेंबली (Wasm) पर आधारित SQLite के कई अनाधिकारिक वर्शन हैं. इनकी मदद से वेब ब्राउज़र में इसका इस्तेमाल किया जा सकता है, जैसे कि sql.js. sqlite3 WASM/JS सबप्रोजेक्ट पहली कोशिश है, जो आधिकारिक तौर पर SQLite प्रोजेक्ट से जुड़ा है. इसके तहत, Wasm को लाइब्रेरी का बिल्ड बनाया जाता है, जो SQLite से डिलीवर किए जा सकने वाले फ़ैमिली ग्रुप के सदस्यों के तौर पर काम करता है. इस प्रोजेक्ट के ठोस लक्ष्यों में ये शामिल हैं:

  • कम-लेवल वाले sqlite3 API को बाइंड करना. यह एपीआई, C के जितना करीब है उतना ही इस्तेमाल किया जा सकता है.
  • यह हाई-लेवल ऑब्जेक्ट-ओरिएंटेड एपीआई है, जो sql.js और Node.js-स्टाइल को लागू करने से मिलता-जुलता है. यह एपीआई, लो-लेवल वाले एपीआई से सीधे तौर पर बात करता है. इस एपीआई का इस्तेमाल, लो-लेवल एपीआई के थ्रेड से ही किया जाना चाहिए.
  • वर्कर पर आधारित एपीआई, जो वर्कर मैसेज के ज़रिए पिछले एपीआई से बात करता है. यह मुख्य थ्रेड में इस्तेमाल करने के लिए बनाया गया है, जिसमें वर्कर थ्रेड में लोअर-लेवल के एपीआई इंस्टॉल हैं. साथ ही, वर्कर मैसेज के ज़रिए उनसे बात करना.
  • वर्कर एपीआई का प्रॉमिस-आधारित वैरिएंट, जो उपयोगकर्ता से क्रॉस-थ्रेड कम्यूनिकेशन के पहलुओं को पूरी तरह छिपा देता है.
  • उपलब्ध JavaScript एपीआई का इस्तेमाल करके स्थायी क्लाइंट-साइड स्टोरेज के लिए सहायता. इनमें ऑरिजिन प्राइवेट फ़ाइल सिस्टम (OPFS) भी शामिल है.

ऑरिजिन प्राइवेट फ़ाइल सिस्टम परसिस्टेंस बैकएंड के साथ SQLite Wasm का इस्तेमाल करना

npm से लाइब्रेरी इंस्टॉल करना

नीचे दिए गए निर्देश की मदद से, npm से @sqlite.org/sqlite-wasm पैकेज को इंस्टॉल करें:

npm install @sqlite.org/sqlite-wasm

ऑरिजिन निजी फ़ाइल सिस्टम

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

जैसा कि आप कल्पना कर सकते हैं, प्रोजेक्ट के लक्ष्यों का आखिरी बिंदु, उपलब्ध JavaScript एपीआई का इस्तेमाल करके स्थायी क्लाइंट-साइड स्टोरेज के लिए सहायता देना, डेटाबेस फ़ाइल में डेटा बनाए रखने के लिए परफ़ॉर्मेंस से जुड़ी सख्त ज़रूरी शर्तों के साथ आता है. यहां ऑरिजिन प्राइवेट फ़ाइल सिस्टम और खास तौर पर FileSystemFileHandle ऑब्जेक्ट के createSyncAccessHandle() तरीके इस्तेमाल किए जाते हैं. इस तरीके से, प्रॉमिस मिलता है, जो प्रॉमिस को FileSystemSyncAccessHandle ऑब्जेक्ट में बदलता है. इसका इस्तेमाल, फ़ाइल को सिंक करके पढ़ने और उसमें लिखने के लिए किया जा सकता है. इस तरीके को सिंक करने से परफ़ॉर्मेंस बेहतर होती है. इसलिए, इसका इस्तेमाल सिर्फ़ ऑरिजिन प्राइवेट फ़ाइल सिस्टम में मौजूद फ़ाइलों के लिए, वेब वर्कर के लिए ही किया जा सकता है, ताकि मुख्य थ्रेड को ब्लॉक न किया जा सके.

आवश्यक हेडर सेट करना

डाउनलोड की गई फ़ाइलों के साथ-साथ, SQLite Wasm संग्रह में sqlite3.js और sqlite3.wasm फ़ाइलें शामिल हैं. ये फ़ाइलें sqlite3 WASM/JS बिल्ड बनाती हैं. jswasm डायरेक्ट्री में कोर sqlite3 डिलीवर किए जा सकने वाले डेटा और टॉप लेवल डायरेक्ट्री में, डेमो और टेस्ट ऐप्लिकेशन शामिल होते हैं. ब्राउज़र, file:// यूआरएल की Wasm फ़ाइलें नहीं दिखाते. इसलिए, इसके साथ बनाए गए किसी ऐप्लिकेशन के लिए वेब सर्वर की ज़रूरत होती है. फ़ाइलें दिखाते समय, सर्वर को अपने रिस्पॉन्स में ये हेडर शामिल करने होंगे:

  • Cross-Origin-Opener-Policy को same-origin डायरेक्टिव पर सेट करें, जो ब्राउज़िंग कॉन्टेक्स्ट को खास तौर पर सेम ऑरिजिन वाले दस्तावेज़ों के लिए अलग करता है. क्रॉस-ऑरिजिन दस्तावेज़ एक ही ब्राउज़िंग कॉन्टेक्स्ट में लोड नहीं किए जाते.
  • Cross-Origin-Embedder-Policy को require-corp डायरेक्टिव पर सेट करें, ताकि कोई दस्तावेज़ एक ही ऑरिजिन से संसाधनों को लोड कर सके या ऐसे संसाधनों को लोड कर सके जिन्हें किसी दूसरे ऑरिजिन से, साफ़ तौर पर लोड किए जा सकने वाले के तौर पर मार्क किया गया हो.

इन हेडर की वजह यह है कि SQLite Wasm, SharedArrayBuffer पर निर्भर करता है. साथ ही, इन हेडर को सेट करना, इसकी सुरक्षा से जुड़ी ज़रूरी शर्तों का हिस्सा है.

DevTools की मदद से ट्रैफ़िक की जांच करने पर, आपको यह जानकारी दिखेगी:

ऊपर बताए गए दो हेडर, क्रॉस-ऑरिजिन-एम्बेडर-पॉलिसी और क्रॉस-ऑरिजिन-ओपनर-पॉलिसी, जिन्हें Chrome DevTools में हाइलाइट किया गया है.

स्पीडटेस्ट

SQLite टीम ने अब काम न करने वाले वेब एसक्यूएल की तुलना में, अपने WebAssembly लागू करने पर कुछ मानदंड लागू किए हैं. इन मानदंड से पता चलता है कि SQLite Wasm, आम तौर पर वेब एसक्यूएल जितना ही तेज़ होता है. कभी-कभी यह थोड़ा धीमा हो जाता है, कभी-कभी थोड़ा तेज़ हो जाता है. पूरी जानकारी, नतीजों के पेज पर देखें.

शुरू करने के लिए कोड सैंपल

जैसा कि पहले बताया गया है, ऑरिजिन प्राइवेट फ़ाइल सिस्टम परसिस्टेंस बैकएंड के साथ SQLite Wasm को वर्कर के हिसाब से चलाना होगा. अच्छी ख़बर यह है कि लाइब्रेरी में ये सभी काम अपने-आप हो जाते हैं और इन्हें सीधे मुख्य थ्रेड से इस्तेमाल किया जा सकता है.

import { sqlite3Worker1Promiser } from '@sqlite.org/sqlite-wasm';

(async () => {
  try {
    console.log('Loading and initializing SQLite3 module...');

    const promiser = await new Promise((resolve) => {
      const _promiser = sqlite3Worker1Promiser({
        onready: () => {
          resolve(_promiser);
        },
      });
    });

    console.log('Done initializing. Running demo...');

    let response;

    response = await promiser('config-get', {});
    console.log('Running SQLite3 version', response.result.version.libVersion);

    response = await promiser('open', {
      filename: 'file:worker-promiser.sqlite3?vfs=opfs',
    });
    const { dbId } = response;
    console.log(
      'OPFS is available, created persisted database at',
      response.result.filename.replace(/^file:(.*?)\?vfs=opfs$/, '$1'),
    );

    await promiser('exec', { dbId, sql: 'CREATE TABLE IF NOT EXISTS t(a,b)' });
    console.log('Creating a table...');

    console.log('Insert some data using exec()...');
    for (let i = 20; i <= 25; ++i) {
      await promiser('exec', {
        dbId,
        sql: 'INSERT INTO t(a,b) VALUES (?,?)',
        bind: [i, i * 2],
      });
    }

    console.log('Query data with exec()');
    await promiser('exec', {
      dbId,
      sql: 'SELECT a FROM t ORDER BY a LIMIT 3',
      callback: (result) => {
        if (!result.row) {
          return;
        }
        console.log(result.row);
      },
    });

    await promiser('close', { dbId });
  } catch (err) {
    if (!(err instanceof Error)) {
      err = new Error(err.result.message);
    }
    console.error(err.name, err.message);
  }
})();

डेमो

डेमो में ऊपर दिया गया कोड देखें. Glitch पर सोर्स कोड देखना न भूलें. ध्यान दें कि नीचे एम्बेड किया गया वर्शन किस तरह OPFS बैकएंड का इस्तेमाल करता है, लेकिन जब डेमो को किसी अलग टैब में खोला जाता है, तब वह काम करता है.

ऑरिजिन निजी फ़ाइल सिस्टम को डीबग करना

SQLite Wasm के ऑरिजिन निजी फ़ाइल सिस्टम आउटपुट को डीबग करने के लिए, OPFS एक्सप्लोरर Chrome एक्सटेंशन का इस्तेमाल करें.

Chrome Web Store में OPFS एक्सप्लोरर.

एक्सटेंशन इंस्टॉल करने के बाद, Chrome DevTools खोलें और OPFS एक्सप्लोरर टैब चुनें. इसके बाद, यह जांच करने के लिए तैयार हो जाएं कि SQLite Wasm ने ऑरिजिन प्राइवेट फ़ाइल सिस्टम में क्या लिखा है.

OPFS एक्सप्लोरर Chrome एक्सटेंशन, डेमो ऐप्लिकेशन का ऑरिजिन निजी फ़ाइल सिस्टम दिखा रहा है.

DevTools में OPFS एक्सप्लोरर विंडो की किसी भी फ़ाइल पर क्लिक करने पर, उसे लोकल डिस्क में सेव किया जा सकता है. इसके बाद, डेटाबेस की जांच करने के लिए SQLite Viewer जैसे ऐप्लिकेशन का इस्तेमाल करें, ताकि आपको यह भरोसा हो सके कि SQLite Wasm वाकई में किए गए वादे के मुताबिक काम करता है.

SQLite Wasm डेमो से डेटाबेस फ़ाइल खोलने के लिए, SQLite Viewer ऐप्लिकेशन का इस्तेमाल किया जाता है.

मदद पाना और सुझाव/राय देना या शिकायत करना

SQLite Wasm को SQLite समुदाय डेवलप और मैनेज करता है. सहायता फ़ोरम में खोजकर और उसमें पोस्ट करके, मदद पाएं और सुझाव/राय दें या शिकायत करें. सभी दस्तावेज़, SQLite साइट पर उपलब्ध हैं.

स्वीकार हैं

Unsplash पर टोबियस फ़िशर की हीरो इमेज.