2016-01-25 4 views
8

एक ही पंक्ति इस तरह डाला जा सकता है:मैं नोड-पोस्टग्रेस के साथ पीजी में कई पंक्तियों को सही ढंग से कैसे सम्मिलित करूं?

client.query("insert into tableName (name, email) values ($1, $2) ", ['john', '[email protected]'], callBack) 

यह दृष्टिकोण स्वचालित रूप से कोई विशेष वर्ण बाहर टिप्पणी।

मैं एक साथ कई पंक्तियों को कैसे सम्मिलित करूं?

मैं इस लागू करने की आवश्यकता:

"insert into tableName (name, email) values ('john', '[email protected]'), ('jane', '[email protected]')" 

मैं सिर्फ मैन्युअल रूप से इस तरह के पंक्तियों को संकलित करने के js स्ट्रिंग ऑपरेटरों का उपयोग कर सकते हैं, लेकिन तब मैं जोड़ने के लिए विशेष वर्ण किसी भी तरह से बचने की जरूरत है।

+0

एक कारण तो आप बस दो बार सम्मिलित करें पर अमल नहीं किया जा सकता है? –

+0

पीजी दस्तावेज़ीकरण के संबंध में यह दृष्टिकोण प्रदर्शन कम होने के कारण बहुत अवांछनीय है – stkvtflw

+0

यदि 1 के बजाय 2 आवेषण निष्पादित करना आपके आवेदन के प्रदर्शन को खतरे में डाल देगा, तो 'नोड-पोस्टग्रेस', आपके लिए बिल्कुल नहीं है। लेकिन मेरा मानना ​​है कि आप इसे गलत तरीके से देख रहे हैं, जहां आप नहीं करना चाहिए अनुकूलित करने की कोशिश कर रहे हैं। यह पुस्तकालय आसानी से 1 सेकंड से कम में 10,000 रिकॉर्ड डाल सकता है। –

उत्तर

2

इस लेख के बाद: Performance Boostpg-promise पुस्तकालय, और उसके द्वारा सुझाए गए दृष्टिकोण से:

// Concatenates an array of objects or arrays of values, according to the template, 
// to use with insert queries. Can be used either as a class type or as a function. 
// 
// template = formatting template string 
// data = array of either objects or arrays of values 
function Inserts(template, data) { 
    if (!(this instanceof Inserts)) { 
     return new Inserts(template, data); 
    } 
    this._rawDBType = true; 
    this.formatDBType = function() { 
     return data.map(d=>'(' + pgp.as.format(template, d) + ')').join(','); 
    }; 
} 

वास्तव में अपने मामले में के रूप में उपयोग, का एक उदाहरण:

var users = [['John', 23], ['Mike', 30], ['David', 18]]; 

db.none('INSERT INTO Users(name, age) VALUES $1', Inserts('$1, $2', users)) 
    .then(data=> { 
     // OK, all records have been inserted 
    }) 
    .catch(error=> { 
     // Error, no records inserted 
    }); 

और यह एक साथ काम करेंगे वस्तुओं की सरणी भी:

var users = [{name: 'John', age: 23}, {name: 'Mike', age: 30}, {name: 'David', age: 18}]; 

db.none('INSERT INTO Users(name, age) VALUES $1', Inserts('${name}, ${age}', users)) 
    .then(data=> { 
     // OK, all records have been inserted 
    }) 
    .catch(error=> { 
     // Error, no records inserted 
    }); 

अद्यतन

एक INSERT क्वेरी के माध्यम से उच्च प्रदर्शन दृष्टिकोण के लिए Multi-row insert with pg-promise देखें।

2
client.query("insert into tableName (name, email) values ($1, $2),($3, $4) ", ['john', '[email protected]','john', '[email protected]'], callBack) 

मदद नहीं करता है?

insert into tableName (name, email) values (" +var1 + "," + var2 + "),(" +var3 + ", " +var4+ ") " 

अगर आप यहाँ पढ़, https://github.com/brianc/node-postgres/issues/530, आप एक ही कार्यान्वयन देख सकते हैं: बारे में अन्य अधिक, तो आप मैन्युअल क्वेरी के लिए एक स्ट्रिंग उत्पन्न कर सकते हैं।

2

का एक दूसरा तरीका PostgreSQL json फ़ंक्शन का उपयोग करके

client.query('INSERT INTO table (columns) ' + 
     'SELECT m.* FROM json_populate_recordset(null::your_custom_type, $1) AS m', 
     [JSON.stringify(your_json_object_array)], function(err, result) { 
     if(err) { 
      console.log(err); 
     } else { 
      console.log(result); 
     } 
}); 
संबंधित मुद्दे