代码之家  ›  专栏  ›  技术社区  ›  David Trinh

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

  •  1
  • David Trinh  · 技术社区  · 6 年前

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

    谢谢。

    • 1)为需要更新的预先存在的记录查询数据库
    • 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 回复  |  直到 6 年前
        1
  •  1
  •   vitaly-t    6 年前

    您的代码显示了许多问题,不可能就确切的问题给出建议。在进行进一步诊断之前,您需要彻底修改代码。

    在你的代码中立即注意到的问题。。。

    问题1

    你忘了锁链 queryBatchOfEverything 对于包含它的事务,即 return queryBatchOfEverything... ,如果这是您的事务逻辑

    问题2

    db 对象,这是无效的,即在另一个事务中不能创建独立的顶级事务。

    你只能在那里创建一个子事务,aka 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);