pg-promise - 使用批处理时无法收到数据库响应

pg-promise - unable to receive db response back when use batch

我在使用 tx.batch 时试图从数据库中获取响应。

谢谢。

批处理调用有效,已验证的记录被插入 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);