SQLite
 sql >> डेटाबेस >  >> RDS >> SQLite

जावास्क्रिप्ट प्रॉक्सी का उपयोग करके SQLite में बूलियन मानों को कैसे प्रबंधित करें

SQLite में बूलियन के साथ समस्या

यदि आपने कभी SQLite के साथ काम किया है, तो आपको समर्थित डेटा प्रकारों और Boolean के बारे में पता होना चाहिए उनमें से एक नहीं है। अधिक विशेष रूप से जैसा कि यहां बताया गया है:

<ब्लॉकक्वॉट>

2.1। बूलियन डेटाटाइप

SQLite में एक अलग बूलियन स्टोरेज क्लास नहीं है। इसके बजाय, बूलियन मानों को पूर्णांक 0 (गलत) और 1 (सत्य) के रूप में संग्रहीत किया जाता है।

SQLite संस्करण 3.23.0 (2018-04-02) के अनुसार "TRUE" और "FALSE" कीवर्ड को पहचानता है, लेकिन वे कीवर्ड वास्तव में क्रमशः पूर्णांक अक्षर 1 और 0 के लिए वैकल्पिक वर्तनी हैं।

SQLite3 के लिए अधिकांश JavaScript लाइब्रेरी TRUE . का समर्थन नहीं करती हैं और FALSE कीवर्ड और उनके लिए आपको पूर्णांकों का उपयोग करके अपने कोड में कथन तैयार करने की आवश्यकता होती है। उदाहरण के लिए, बेहतर-sqlite3 में आपको यह करना होगा:

const payload = {
  isActive: 1, // <======
  username: 'Brad',
  password: '1234',
  email: '[email protected]',
};

const result = database
  .prepare(
    `INSERT INTO accounts(isActive, username, password, email) VALUES(@isActive, @username, @password, @email) `
  )
  .run({ bucketID, taskSiteID, name, username, password, email }).changes;

number का उपयोग करना Boolean . के बजाय आपके पूरे ऐप में एक भयानक डेवलपर अनुभव होगा (साथ ही शायद अधिक मेमोरी का उपयोग करें)।

आप अपने पेलोड ऑब्जेक्ट्स 'बूलियन . को बदलने के लिए एक सहायक फ़ंक्शन का उपयोग कर सकते हैं संख्याओं . के गुण (मैंने वास्तव में इसे एक बार अतीत में किया था), लेकिन फिर आपको प्रत्येक प्रश्न से पहले इसे मैन्युअल रूप से चलाना होगा। ओह। क्या यह बहुत अच्छा नहीं होगा यदि इस तर्क को पृष्ठभूमि में निष्पादित किया गया था, हर बार जब हम एक बयान तैयार करते और चलाते थे?

स्वागत है ES6 प्रॉक्सी 👋 

नई JavaScript सुविधाओं में से एक है Proxy वस्तु। प्रॉक्सी अनिवार्य रूप से "ट्रैप" हैं जो ऑब्जेक्ट ऑपरेशंस जैसे गेटर्स, सेटर्स और फ़ंक्शन कॉल को रोकते हैं। प्रॉक्सी का उपयोग करना हम अपने स्वयं के तर्क को निष्पादित करने के लिए SQLite JS रैपर लाइब्रेरी को संशोधित कर सकते हैं, एक मिडलवेयर की तरह।

हेल्पर फंक्शन लिखना

विकास में आसानी के लिए, हम mapValues . का उपयोग करने जा रहे हैं &isPlainObject lodash से उपयोगिता कार्य करता है, लेकिन आप निश्चित रूप से अपना कोड कोड कर सकते हैं। नीचे दिया गया फ़ंक्शन किसी ऑब्जेक्ट (एक-स्तरीय गहरा) के माध्यम से मैप करेगा और boolean . प्रकार के मानों को रूपांतरित करेगा number टाइप करने के लिए .

import { mapValues } from 'lodash';

const booleanEntriesToNumbers = (object) =>
  mapValues(object, (value) =>
    typeof value === 'boolean' ? Number(value) : value
  );

क्वेरी कॉल को इंटरसेप्ट करने के लिए प्रॉक्सी का उपयोग करना

नीचे हम better-sqlite3 आयात करते हैं पुस्तकालय और एक नया डेटाबेस उदाहरण बनाएँ। बाद में, हम डिफ़ॉल्ट को ओवरराइड करते हैं prepare हमारे अपने तरीके से, जो बदले में run . विधियों को ओवरराइड करता है , get और all , प्रत्येक के लिए एक नया प्रॉक्सी बनाकर। आप निश्चित रूप से अपनी इच्छित किसी अन्य विधि के लिए प्रॉक्सी बना सकते हैं।

import Database from 'better-sqlite3';

// Create new database instance
const db = new Database(dbFilePath);

// We will use this function to override the default "prepare" method
const proxiedPrepare = new Proxy(db.prepare, {
    apply: (prepare, prepareThisArg, [stringStatement]) => {
      const statement = prepare.call(prepareThisArg, stringStatement);

      // Override the default "run" method
      statement.run = new Proxy(statement.run, {
        apply: (run, runThisArg, args) => {
          const mappedArgs = args.map((arg) =>
            isPlainObject(arg) ? booleanEntriesToNumbers(arg) : arg
          );

          return run.call(runThisArg, ...mappedArgs);
        },
      });

      // Override the default "get" method
      statement.get = new Proxy(statement.get, {
        apply: (get, getThisArg, args) => {
          const mappedArgs = args.map((arg) =>
            isPlainObject(arg) ? booleanEntriesToNumbers(arg) : arg
          );

          return get.call(getThisArg, ...mappedArgs);
        },
      });

      // Override the default "all" method
      statement.all = new Proxy(statement.all, {
        apply: (all, allThisArg, args) => {
          const mappedArgs = args.map((arg) =>
            isPlainObject(arg) ? booleanEntriesToNumbers(arg) : arg
          );

          return all.call(allThisArg, ...mappedArgs);
        },
      });

      return statement;
    },
  });

// Override the default "prepare" method
db.prepare = proxiedPrepare;

अनिवार्य रूप से, एक बार कॉल करने के बाद prepare विधि ट्रिगर होती है, हम जावास्क्रिप्ट को बताते हैं:रुको! हम इस फ़ंक्शन कॉल को संशोधित करना चाहते हैं। उस तर्क को निष्पादित करने के बजाय जो मूल डेवलपर का इरादा था, हम इसके बजाय पहले अपने तर्क को निष्पादित करना चाहते हैं (जो कि ऑब्जेक्ट पेलोड की मैपिंग है)। अपने स्वयं के तर्क को निष्पादित करने के बाद, हम call . का उपयोग करके मूल विधि को कॉल करने का परिणाम लौटाते हैं this को बाइंड करने के लिए बहस। यदि आप इस बारे में अधिक पढ़ना चाहते हैं कि प्रॉक्सी कैसे काम करती है, तो यहां पढ़ें। हमारे कार्यान्वयन के लिए हमने apply . का इस्तेमाल किया यहाँ विधि।

इस पोस्ट को पढ़ने के लिए धन्यवाद, मुझे आशा है कि इससे किसी को जावास्क्रिप्ट में SQLite के साथ काम करने में मदद मिली 👊


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Play Store पर Android पुश अपडेट

  2. SQLite डेटाबेस लीक पाया गया

  3. डेटाबेस '/data/data/msv_database.db' के लिए कनेक्शन पूल कनेक्शन देने में असमर्थ रहा है। कनेक्शन:0 सक्रिय, 1 निष्क्रिय, 0 उपलब्ध

  4. कॉलम हेडर के साथ कॉलम के रूप में SQLite क्वेरी परिणाम प्रारूपित करें

  5. ड्रॉप टेबल यदि SQLite में मौजूद है