使用tx.batch时,我试图从数据库中获取响应。
谢谢。
批量调用确实有效,已验证的记录已插入或/和更新到数据库中。
db.tx(t1 => {
let queryCheck = [];
reqData.forEach(obj => {
for (let key in obj) {
obj[key].resovledURLs.forEach(data => {
queryCheck.push(
t1.any(
`SELECT * FROM testDB WHERE url='${key}' AND testurl='${data}';`
)
);
});
}
});
return t1
.batch(queryCheck)
.then(data => {
return t1.tx(t2 => {
let t2QueryBatch = [];
// got rid of queryBatchOfEverything()
// uses data from t1.batch(queryCheck) to make joinedArray
let joinedArray = updateArray.concat(createArray);
joinedArray.forEach(obj => {
if (obj.queryType === "Update") {
t2QueryBatch.push(
t2.none(
`UPDATE testDB SET count = count + 1 WHERE url='${
obj.url
}' AND errorurl='${obj.testurl}';`
)
);
} else {
t2QueryBatch.push(
t2.none(
`INSERT INTO testDB (url, testurl) VALUES ('${
obj.url
}', '${obj.testurl}');`
)
);
}
});
return t2.batch(t2QueryBatch);
});
})
.then(data => {
console.log(data);
});
});
答案 0 :(得分:1)
您的代码存在很多问题,无法就确切的问题提出建议。您甚至需要进一步修改代码,然后才能进行进一步的诊断。
如果这是您的交易逻辑,则您忘记将queryBatchOfEverything
链接到包含它的交易,即应为return queryBatchOfEverything...
您在db
对象上打开了一个嵌套事务,这是无效的,即您无法在另一个事务中创建独立的顶级事务。
您只能在父交易(即savepoint
)的上下文中在此创建子交易,也称为t1.tx(t2 => {})
。
您忘了将嵌套事务的结果链接到父事务,因此您会面临另一个宽松的承诺。它必须为return t1.tx(t2 => )
您在嵌套事务中使用方法one
,这意味着您希望返回的数据正好是一行,而您的查询都不会返回任何内容,也就是说,您应该在其中使用方法none
。这就是您所问的问题。但是您需要修复其余部分,以便整体正常工作。
您不会将t2.batch
链接到交易,从而产生另一个宽松的承诺。应该是return t2.batch
。
这不是问题,只是一些无用的代码:
let updateRecords = await t1.batch(queryCheck).then(data => {
return data;
});
它与此完全相同:
let updateRecords = await t1.batch(queryCheck);