javascript - knex中的批量更新

标签 javascript knex.js

我想使用 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/

相关文章:

javascript - 在列表之间添加元素

javascript - 使用像 requireJs 这样的 webpack 扩展应用程序

mysql - 使用 bookshelf/knex 中的位置过滤数据时出现问题

javascript - 将变量调用到不同的路径在 Nodejs 和 Express 中不起作用

javascript - 为什么response.data未定义?

node.js - Bookshelf.js/Knex.js 上数据库模式加载的常见做法

mysql - Knex - MySQL 如何在单个 JavaScript 字符串中执行多个语句?

javascript - 数组未传递给 knex 中的查询

sql - 仅使用 SQL 匹配 DataLoader API

javascript - unshift 方法不断将新对象推送到选择器中