pg-promise-使用批处理时

时间:2018-08-06 19:37:04

标签: postgresql pg-promise

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

谢谢。

  • 1)查询db以获取需要更新的现有记录
  • 2)使用1的结果,对db进行另一个批处理调用 创建或更新记录
  • 3)使用创建的记录以状态200回复​​我的api, 记录已更新

批量调用确实有效,已验证的记录已插入或/和更新到数据库中。

 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 个答案:

答案 0 :(得分:1)

您的代码存在很多问题,无法就确切的问题提出建议。您甚至需要进一步修改代码,然后才能进行进一步的诊断。

您的代码中立即出现的问题...

问题1

如果这是您的交易逻辑,则您忘记将queryBatchOfEverything链接到包含它的交易,即应为return queryBatchOfEverything...

问题2

您在db对象上打开了一个嵌套事务,这是无效的,即您无法在另一个事务中创建独立的顶级事务。

您只能在父交易(即savepoint)的上下文中在此创建子交易,也称为t1.tx(t2 => {})

问题3

您忘了将嵌套事务的结果链接到父事务,因此您会面临另一个宽松的承诺。它必须为return t1.tx(t2 => )

问题4

您在嵌套事务中使用方法one,这意味着您希望返回的数据正好是一行,而您的查询都不会返回任何内容,也就是说,您应该在其中使用方法none。这就是您所问的问题。但是您需要修复其余部分,以便整体正常工作。

问题5

您不会将t2.batch链接到交易,从而产生另一个宽松的承诺。应该是return t2.batch

问题6

这不是问题,只是一些无用的代码:

let updateRecords = await t1.batch(queryCheck).then(data => {
    return data;
});

它与此完全相同:

let updateRecords = await t1.batch(queryCheck);