我正在按照这里和那里的建议实施 Vitaly 的 pg-promise 性能模式。
这是我的代码:
for (var i=0;i<chunkedData.length;i++){
var insertData = chunkedData[i].map(function (d) {
return {
application_id: d.application_id,
country_id: d.country_id,
collection_id: collectionId
};
});
// Would need to make a loop here, and thus turning the result into an array
var updateData = {
application_id: chunkedData[i][j].application_id,
country_id: chunkedData[i][j].country_id,
collection_id: collectionId
};
var query = h.insert(insertData, cs) +
" ON CONFLICT ON CONSTRAINT application_average_ranking_application_id_country_id_colle_key DO UPDATE SET " +
h.sets(updateData, cs);
db.none(query)
.then(data => {
console.log('success');
})
.catch(error=> {
console.log('insert error : ' + error);
});
}
我的问题是 insertData 是一个对象数组,并且库的插入助手使用该数组构建插入请求,如pg-promise API中所指定。而 updateData 必须是一个简单的对象。
我希望在以下情况下:
ON CONFLICT ON CONSTRAINT constraintName DO UPDATE
被触发时,更新值匹配 'insertData' 数组中的相应对象。
我该如何解决这个问题?
我试图将所有内容都放在一个循环中,但它会像疯了一样泄漏内存,而且,我失去了这种模式的好处......
编辑 :
我希望我的查询相当于:
var inserts = data.map(entry => {
return t.none(" INSERT INTO application_average_ranking (application_id,country_id,collection_id) VALUES ($1,$2,$3)" +
" ON CONFLICT ON CONSTRAINT application_average_ranking_application_id_country_id_colle_key" +
" DO UPDATE SET country_id=$2,collection_id=$3",
[entry.application_id,entry.country_id,collectionId]
);
});
在这种情况下,当调用 Update 时,参数指的是最初建议插入的值。