我想使用 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 做的事情。然而,这违背了 knex 作为 DB 抽象层的目的(它引入了强大的 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
});
关于javascript - knex中的批量更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40543668/