【问题标题】:What is the best way to perform multiple operations in a Knex transaction在 Knex 事务中执行多个操作的最佳方式是什么
【发布时间】:2021-11-17 15:45:21
【问题描述】:

我对 knex 和交易比较陌生。基本上我必须在不同的 POSTGRES 表中执行一堆批量插入和更新,并且想了解最好的方法。 以下是正确的方法吗?我在批量更新部分特别苦恼。

let fieldsToInsert = [{name:'Mike', age: 57, weight:66, gender:'M'}, ...]
let _user = {user_id:99, city:6}
return db.transaction(trx => {
            return trx.insert(fieldsToInsert)
            .into("users")
            .then(() => {
                const queries = fieldsToInsert.map((user) => {
                    db("biodata").update({"name": user.name}).where({"id": user.age})
                })
                return Promise.all(queries)
            }).then(() => {
                const queries = fieldsToInsert.map((user) => {
                    db("weight_and_gender".update({"weight": user.weight, "gender": user.gender}))
                })
                return Promise.all(queries)
            })   
        }).catch((err) => {
            console.log(err)
        })

【问题讨论】:

    标签: javascript node.js postgresql transactions knex.js


    【解决方案1】:
    await db.transaction(async trx => {
      const insertedRows = await trx('users').insert(fieldsToInsert).returning('*');
      for (let row in insertedRow) {
        await trx('biodata').update({name : row.name}).where('id', row.id);       
        await trx('weight_and_gender').update({weight : row.weight, gender: row.gender}).where('id', row.id);       
      }
    });
    

    尝试与Promise.all 并行运行更新无济于事。如果它们在同一个事务中执行,DB 驱动程序无论如何都会缓冲它们并以任何一种方式顺序运行它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-10
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 2018-05-06
      • 2010-09-19
      相关资源
      最近更新 更多