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

PostgreSQL/NodeJS के साथ परिणामों की सरणी के रूप में तालिका में शामिल हों प्राप्त करें

पीजी-वादे के साथ यह करना आसान है:

function buildTree(t) {
    const v = q => t.any('SELECT id, value FROM votes WHERE question_id = $1', q.id)
        .then(votes => {
            q.votes = votes;
            return q;
        });

    return t.map('SELECT * FROM questions', undefined, v).then(a => t.batch(a));
}

db.task(buildTree)
    .then(data => {
        console.log(data); // your data tree
    })
    .catch(error => {
        console.log(error);
    });

ऊपर जैसा ही है, लेकिन ES7 async का उपयोग कर रहा है /await वाक्य रचना:

await db.task(async t => {
    const questions = await t.any('SELECT * FROM questions');
    for(const q of questions) {
        q.votes = await t.any('SELECT id, value FROM votes WHERE question_id = $1', [q.id]);
    }
    return questions;
});
// method "task" resolves with the correct data tree

एपीआई:नक्शा, कोई भी, कार्य, बैच

संबंधित प्रश्न:

  • पीजी-वादे के साथ माता-पिता + बच्चों का पेड़ प्राप्त करें
  • सशर्त कार्य स्नातकोत्तर-वादे के साथ

और यदि आप केवल एक क्वेरी का उपयोग करना चाहते हैं, तो PostgreSQL 9.4 और बाद के सिंटैक्स का उपयोग करके आप निम्न कार्य कर सकते हैं:

SELECT json_build_object('id', q.id, 'content', q.content, 'votes',
    (SELECT json_agg(json_build_object('id', v.id, 'value', v.value))
     FROM votes v WHERE q.id = v.question_id))
FROM questions q

और फिर आपका स्नातकोत्तर-वादा उदाहरण होगा:

const query =
    `SELECT json_build_object('id', q.id, 'content', q.content, 'votes',
        (SELECT json_agg(json_build_object('id', v.id, 'value', v.value))
         FROM votes v WHERE q.id = v.question_id)) json
    FROM questions q`;
    
const data = await db.map(query, [], a => a.json);

और आप निश्चित रूप से ऐसे जटिल प्रश्नों को बाहरी SQL फ़ाइलों में रखना चाहेंगे। क्वेरी फ़ाइलें देखें।

निष्कर्ष

ऊपर प्रस्तुत दो दृष्टिकोणों के बीच चुनाव आपके आवेदन की प्रदर्शन आवश्यकताओं पर आधारित होना चाहिए:

  • एकल-क्वेरी दृष्टिकोण तेज़ है, लेकिन काफी क्रियात्मक होने के कारण इसे पढ़ना या विस्तारित करना कुछ कठिन है
  • बहु-क्वेरी दृष्टिकोण को समझना और विस्तारित करना आसान है, लेकिन निष्पादित प्रश्नों की गतिशील संख्या के कारण यह प्रदर्शन के लिए बहुत अच्छा नहीं है।

अद्यतन-1

निम्नलिखित संबंधित उत्तर बाल प्रश्नों को संयोजित करके अधिक विकल्प प्रदान करता है, जो बहुत बेहतर प्रदर्शन देगा:नेस्टेड लूप क्वेरी को मूल परिणाम pg-वादा में संयोजित करें।

अद्यतन-2

एक और उदाहरण जोड़ा गया, ES7 async . का उपयोग करते हुए /await दृष्टिकोण।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पोस्टग्रेज - आसन्न सूची को नेस्टेड JSON ऑब्जेक्ट में बदलें

  2. PostgreSQL में कॉलम के डेटा प्रकार की जांच करने के 3 तरीके

  3. PL/pgSQL जाँच कर रहा है कि क्या कोई पंक्ति मौजूद है

  4. दो स्तंभों के संयोजन पर अद्वितीय बाधा?

  5. PostgreSQL और SQL सर्वर के साथ UUID को हाइबरनेट करें