मैं पीजी-वादा का लेखक हूं।
लाइब्रेरी के पुराने संस्करणों में इसे परफॉरमेंस बूस्ट लेख में सरलीकृत उदाहरणों द्वारा कवर किया गया था, जो उच्च-प्रदर्शन डेटाबेस अनुप्रयोगों को लिखते समय अभी भी एक अच्छा पढ़ा जाता है।
नया तरीका हेल्पर्स नेमस्पेस पर भरोसा करना है, जो अंततः लचीला है, और प्रदर्शन के लिए अनुकूलित है।
const pgp = require('pg-promise')({
/* initialization options */
capSQL: true // capitalize all generated SQL
});
const db = pgp(/*connection*/);
// our set of columns, to be created only once (statically), and then reused,
// to let it cache up its formatting templates for high performance:
const cs = new pgp.helpers.ColumnSet(['col_a', 'col_b'], {table: 'tmp'});
// data input values:
const values = [{col_a: 'a1', col_b: 'b1'}, {col_a: 'a2', col_b: 'b2'}];
// generating a multi-row insert query:
const query = pgp.helpers.insert(values, cs);
//=> INSERT INTO "tmp"("col_a","col_b") VALUES('a1','b1'),('a2','b2')
// executing the query:
await db.none(query);
एपीआई देखें:कॉलमसेट, इंसर्ट करें।
इस तरह के इंसर्ट के लिए लेन-देन की भी आवश्यकता नहीं होती है, क्योंकि यदि मानों का एक सेट डालने में विफल रहता है, तो कोई भी इंसर्ट नहीं करेगा।
और आप निम्न में से कोई भी प्रश्न उत्पन्न करने के लिए उसी दृष्टिकोण का उपयोग कर सकते हैं:
- एकल-पंक्ति
INSERT
- बहु-पंक्ति
INSERT
- एकल-पंक्ति
UPDATE
- बहु-पंक्ति
UPDATE
क्या ${} नोटेशन का उपयोग करने वाले इंसर्शन sql इंजेक्शन से सुरक्षित हैं?
हाँ, लेकिन अकेले नहीं। यदि आप गतिशील रूप से स्कीमा/टेबल/कॉलम नाम सम्मिलित कर रहे हैं, तो SQL नामों का उपयोग करना महत्वपूर्ण है, जो संयोजन में आपके कोड को SQL इंजेक्शन से सुरक्षित रखेंगे।
संबंधित प्रश्न:Node.js में PostgreSQL बहु-पंक्ति अद्यतन
अतिरिक्त
प्रश्न:id
कैसे प्राप्त करें एक ही समय में प्रत्येक नए रिकॉर्ड का?
ए: बस RETURNING id
. जोड़कर आपकी क्वेरी के लिए, और इसे कई तरीकों से निष्पादित करना:
const query = pgp.helpers.insert(values, cs) + ' RETURNING id';
const res = await db.many(query);
//=> [{id: 1}, {id: 2}, ...]
या इससे भी बेहतर, आईडी-एस प्राप्त करें, और विधि मानचित्र का उपयोग करके परिणाम को पूर्णांकों की सरणी में परिवर्तित करें:
const res = await db.map(query, undefined, a => +a.id);
//=> [1, 2, ...]
यह समझने के लिए कि हमने +
. का उपयोग क्यों किया? वहां, देखें:पीजी-वादा स्ट्रिंग के रूप में पूर्णांक देता है।
अद्यतन-1
बड़ी संख्या में रिकॉर्ड डालने के लिए, डेटा आयात देखें।
अद्यतन-2
v8.2.1 और बाद के संस्करण का उपयोग करके, आप स्थिर क्वेरी-पीढ़ी को एक फ़ंक्शन में लपेट सकते हैं, इसलिए इसे क्वेरी विधि के भीतर उत्पन्न किया जा सकता है, जब क्वेरी पीढ़ी विफल होने पर अस्वीकार करने के लिए:
// generating a multi-row insert query inside a function:
const query = () => pgp.helpers.insert(values, cs);
//=> INSERT INTO "tmp"("col_a","col_b") VALUES('a1','b1'),('a2','b2')
// executing the query as a function that generates the query:
await db.none(query);