如何在多个插入之间进行相关有效性检查的knex事务中执行多次插入?

时间:2019-09-16 17:34:15

标签: node.js knex.js

我正在编写一个多步骤knex事务,该事务需要在表中插入多个记录。这些记录中的每一个在插入之前都需要通过用Node编写的有效性检查。

我将批量执行有效性检查,然后一次插入所有内容,只是两条记录可能彼此无效。即如果我插入记录1,则记录2可能不再有效。

不幸的是,我似乎无法以事务感知的方式查询数据库。在第二条记录的有效性检查期间,我的查询(用于有效性检查)没有显示第一个插入项存在。


我使用的是trx(事务)连接对象,而不是基础的knex对象。我希望这样可以解决此问题,因为该事务连接对象应该可以接受承诺,但是事实并非如此。

await knex.transaction(async trx => {

        /* perform validity checks and insert if valid */

        /* Check the record slated to be created 
         * against the rules to ensure validity. */

        relationshipValidityChecks = await Promise.all(
          relationshipsToCreate.map(async r => {
            const obj = {
              fromId: r.fromId,
              toId: r.toId,
              type: r.type,
              ...(await relationshipIsValid( // returns an object with validity boolean
                    r.fromId, 
                    r.toId, 
                    r.type, 
                    trx // i can specify which connection obj to use (trx/knx)
               ))
            };
            if (obj.valid) {
              await trx.raw(
                `
                insert into t1.relationship
                (from_id, to_id, type) values
                (?, ?, ?)
                returning relationship_key;
                `,
                [r.fromId, r.toId, r.type]
              );
            }

            return obj;
          })
        );
}

当我输入两个有效但彼此无效的记录时,应插入第一个记录,第二个记录应返回无效错误。 relationshipIsValid有点复杂,因此我省略了它,但是我确定它能按预期工作,因为如果我分别输入上述两个记录(即在两个不同的端点调用中),第二个记录将返回无效错误。

任何帮助将不胜感激。谢谢!

0 个答案:

没有答案