javascript – knex中的批量更新

前端之家收集整理的这篇文章主要介绍了javascript – knex中的批量更新前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想使用 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
});

猜你在找的JavaScript相关文章