我想使用
Knex.js执行批量更新
例如:
'UPDATE foo SET [theValues] WHERE idFoo = 1' 'UPDATE foo SET [theValues] WHERE idFoo = 2'
价值观:
{ name: "FooName1",checked: true } // to `idFoo = 1` { name: "FooName2",checked: false } // to `idFoo = 2`
我以前使用的是node-mysql,它允许多个语句.使用它时,我只是构建了一个多语句查询字符串,只需在一次运行中通过线路发送.
我不确定如何用Knex实现同样的目标.我可以看到batchInsert作为我可以使用的API方法,但就batchUpdate而言,没有任何意义.
注意:
>我可以进行异步迭代并分别更新每一行.这是不好的原因,这意味着从服务器到数据库将会有很多往返
>我可以使用Knex的raw()东西,可能会做类似于我对node-MysqL的操作.然而,这破坏了作为DB抽象层的整个knex目的(它引入了强大的DB耦合)
所以我想用“knex-y”这样做.
任何想法欢迎.
解决方法
我需要在事务中执行批量更新(我不想在出现问题时进行部分更新).
我已经通过下一个方式解决了这个问题:
我已经通过下一个方式解决了这个问题:
// I wrap knex as 'connection' return connection.transaction(trx => { const queries = []; users.forEach(user => { const query = connection('users') .where('id',user.id) .update({ lastActivity: user.lastActivity,points: user.points,}) .transacting(trx); // This makes every update be in the same transaction queries.push(query); }); Promise.all(queries) // Once every query is written .then(trx.commit) // We try to execute all of them .catch(trx.rollback); // And rollback in case any of them goes wrong });