任务是从column对象获取部分数据并将其发送到数据库。零件必须具有insertMaxRows的最大大小。
我尝试了一些迭代并使用了模运算符。但是我还是一个初学者,无法解决这个问题。
var insertMaxRows = utils.GetInsertMaxRows(); //right now its 2
var idx = 1;
for (var i = 0; i < columns.id.length; i++) {
if (idx % insertMaxRows == 0){
var params = [];
//this takes just 1 value, i know
params.push(columns.codes[idx -1]);
params.push(columns.product_id[idx -1]);
params.push(columns.id[idx -1]);
updateSql = "UPDATE TProductCodes SET code =?, product_id =? WHERE id =?";
sql.query(connection, params, etc, callback) {
//sends stuff to database
});
idx++;
}
例如,当insertMaxRows
为2
时,此代码应将数组中的前2个项目发送到数据库,然后将其后的2个项目发送到数据库,依此类推,然后其余的发送
请注意,这是针对NODE JS的,如果有关系的话,它将通过异步函数发送到数据库。
答案 0 :(得分:1)
这就是我可能的处理方式。它遍历数据,并创建一个新的Promise,其中包含每个数据块的UPDATE调用(我splice
来自数组)。您可以使用Promise.all
等待所有更新解决。
// set up the data
const data = [];
for (let i = 0; i < 100; i++) {
data.push(i);
}
function UPDATE(data) {
return new Promise(resolve => {
// mimic an SQL UPDATE query
setTimeout(() => resolve(), 2000);
});
}
function getPromises(data, limit) {
const promises = [];
// Iterate through the data, splicing off a chunk at
// a time, and creating a new promise for each
for (let i = 0; i < data.length; i++) {
const chunk = data.splice(0, limit);
promises.push(UPDATE(chunk));
}
return promises;
}
(async () => {
const limit = 12;
// Wait until all the promises have resolved
await Promise.all(getPromises(data, limit));
console.log('Done');
})();
答案 1 :(得分:0)
另一种方法是根据fcntl()
的极限值arrays
,在三元组或成对子组中准备线性insertMaxRows
,以便将数组拆分成对。
之后,您可以在两对上进行2
循环。在此示例中,有7个值,因此最后一个值将是单个。
处理完列对象后,将如下所示:
forEach
将{
id: [[1, 2], [3, 4], [5, 6], [7]],
product_id: [[11, 22], [33, 44], [55, 66], [77]],
codes: [["a", "b"], ["c", "d"], ["e", "f"], ["g"]]
}
对象内部的3个线性数组除以极限值的函数示例。
columns
如果您需要更多有关如何将两对或三元组缝合回线性阵列的帮助,例如将这种样式var insertMaxRows = 2;
var columns = {
id : [1,2,3,4,5,6,7],
codes : ['a','b','c','d','e','f','g'],
product_id : [11,22,33,44,55,66,77],
};
console.log(columns); // before grouping values
function groupArrayByLimit(arr,limit){
if(typeof arr == 'object' && typeof limit == 'number' && limit>=1){
var res = [];
while (arr.length) {
var tmp = [];
var itt = 0
while (itt<limit && arr.length){
tmp.push(arr.shift());
itt++;
//console.log(tmp);
}
res.push(tmp);
//console.log(res);
}
return res;
}
return null;
}
columns.id = groupArrayByLimit(columns.id,insertMaxRows);
columns.codes = groupArrayByLimit(columns.codes,insertMaxRows);
columns.product_id = groupArrayByLimit(columns.product_id,insertMaxRows);
console.log(columns); // after regrouping values
作为MySQL查询的参数,请在注释中告知我们。