pg-promise - 使用批处理时无法收到数据库响应
pg-promise - unable to receive db response back when use batch
我在使用 tx.batch 时试图从数据库中获取响应。
谢谢。
- 1) 查询数据库以获取需要更新的预先存在的记录
- 2) 使用 1 的结果,对 db 进行另一个批处理调用
创建或更新记录
- 3) 以状态 200 回复我的 api 并创建记录
记录已更新
批处理调用有效,已验证的记录被插入 or/and 更新到数据库中。
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);
});
});
您的代码存在太多问题,无法就确切问题提出建议。在进行任何进一步的诊断之前,您需要彻底修改代码。
您的代码中存在可立即注意到的问题...
问题 1
您忘记将 queryBatchOfEverything
链接到包含它的交易,即它应该是 return queryBatchOfEverything...
,如果这是您的交易逻辑
问题 2
您在 db
对象上打开了一个无效的嵌套事务,即您不能在另一个事务中创建独立的顶级事务。
您只能在父交易的上下文中创建一个子交易,也就是 savepoint
,即 t1.tx(t2 => {})
.
问题 3
您忘记将嵌套事务的结果链接到父事务中,所以您手上又一个松散的承诺。需要 return t1.tx(t2 => )
问题 4
您在嵌套事务中使用了方法 one
,这意味着您只希望返回一行数据,而 none 的查询 return 任何东西,即您应该改用 none
方法。这就是你问的问题。但是您需要修复其余部分才能使整体正常工作。
问题 5
您没有将 t2.batch
链接到交易,创建另一个松散的承诺。应该是 return t2.batch
.
问题 6
这不是问题,只是一些无用的代码:
let updateRecords = await t1.batch(queryCheck).then(data => {
return data;
});
和这个一模一样:
let updateRecords = await t1.batch(queryCheck);
我在使用 tx.batch 时试图从数据库中获取响应。
谢谢。
- 1) 查询数据库以获取需要更新的预先存在的记录
- 2) 使用 1 的结果,对 db 进行另一个批处理调用 创建或更新记录
- 3) 以状态 200 回复我的 api 并创建记录 记录已更新
批处理调用有效,已验证的记录被插入 or/and 更新到数据库中。
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);
});
});
您的代码存在太多问题,无法就确切问题提出建议。在进行任何进一步的诊断之前,您需要彻底修改代码。
您的代码中存在可立即注意到的问题...
问题 1
您忘记将 queryBatchOfEverything
链接到包含它的交易,即它应该是 return queryBatchOfEverything...
,如果这是您的交易逻辑
问题 2
您在 db
对象上打开了一个无效的嵌套事务,即您不能在另一个事务中创建独立的顶级事务。
您只能在父交易的上下文中创建一个子交易,也就是 savepoint
,即 t1.tx(t2 => {})
.
问题 3
您忘记将嵌套事务的结果链接到父事务中,所以您手上又一个松散的承诺。需要 return t1.tx(t2 => )
问题 4
您在嵌套事务中使用了方法 one
,这意味着您只希望返回一行数据,而 none 的查询 return 任何东西,即您应该改用 none
方法。这就是你问的问题。但是您需要修复其余部分才能使整体正常工作。
问题 5
您没有将 t2.batch
链接到交易,创建另一个松散的承诺。应该是 return t2.batch
.
问题 6
这不是问题,只是一些无用的代码:
let updateRecords = await t1.batch(queryCheck).then(data => {
return data;
});
和这个一模一样:
let updateRecords = await t1.batch(queryCheck);