अपडेट करें
निम्नलिखित लेख को पढ़ना सबसे अच्छा है:डेटा आयात ।
pg-promise के लेखक के रूप में आखिर में मुझे सवाल का सही जवाब देने के लिए मजबूर होना पड़ा, क्योंकि पहले प्रकाशित एक ने वास्तव में इसे न्याय नहीं किया था।
विशाल/अनंत संख्या में रिकॉर्ड सम्मिलित करने के लिए, आपका दृष्टिकोण विधि अनुक्रम , जो कार्यों और लेन-देन में उपलब्ध है।
var cs = new pgp.helpers.ColumnSet(['col_a', 'col_b'], {table: 'tableName'});
// returns a promise with the next array of data objects,
// while there is data, or an empty array when no more data left
function getData(index) {
if (/*still have data for the index*/) {
// - resolve with the next array of data
} else {
// - resolve with an empty array, if no more data left
// - reject, if something went wrong
}
}
function source(index) {
var t = this;
return getData(index)
.then(data => {
if (data.length) {
// while there is still data, insert the next bunch:
var insert = pgp.helpers.insert(data, cs);
return t.none(insert);
}
// returning nothing/undefined ends the sequence
});
}
db.tx(t => t.sequence(source))
.then(data => {
// success
})
.catch(error => {
// error
});
प्रदर्शन के दृष्टिकोण और लोड थ्रॉटलिंग दोनों से, डेटाबेस में बड़ी संख्या में पंक्तियों को सम्मिलित करने का यह सबसे अच्छा तरीका है।
आपको बस अपने फंक्शन को लागू करना है getData
index
के आधार पर आपके ऐप के लॉजिक के अनुसार, यानी आपका बड़ा डेटा कहां से आ रहा है अनुक्रम में, वस्तुओं के आकार और डेटा उपलब्धता के आधार पर, एक बार में कुछ 1,000 - 10,000 वस्तुओं को वापस करने के लिए।
कुछ एपीआई उदाहरण भी देखें:
संबंधित प्रश्न:नोड-पोस्टग्रेज भारी मात्रा में प्रश्नों के साथ ।
और ऐसे मामलों में जहां आपको सम्मिलित किए गए सभी रिकॉर्ड्स के जेनरेट किए गए आईडी-एस प्राप्त करने की आवश्यकता है, आप दो पंक्तियों को इस प्रकार बदल देंगे:
// return t.none(insert);
return t.map(insert + 'RETURNING id', [], a => +a.id);
और
// db.tx(t => t.sequence(source))
db.tx(t => t.sequence(source, {track: true}))
बस सावधान रहें, क्योंकि मेमोरी में बहुत सारे रिकॉर्ड आईडी-एस रखने से ओवरलोड हो सकता है।