使用 SequelizebulkCreate 作为批量更新

问题描述 投票:0回答:1

我们有一个使用 Sequelize 和 postgresql 的节点项目,我需要提高一些端点的性能。代码中有几种情况是对每一行进行更新查询(每行都有不同的数据),即使有 50 行左右,这也会成为一个问题。所以,我正在尝试实现批量更新之类的东西。

Sequelize.Model的bulkCreate方法有选项

updateOnDuplicate
,所以,如果你只传递已经存在的行,你实际上可以将它用作“批量更新”,而且比对每一行进行更新要快得多。例如:

await models.Shipping.bulkCreate(
  shippings,
  {
    fields: ['packageId', 'labelUrl', 'custom'],
    updateOnDuplicate: ['label_url', 'custom']
  }
)

其中

shippings
是包含行数据的数组。这将更新数据库中每一行的字段
label_url
custom

但显然,只有将所有必要的行数据传递给bulkCreate 才能做到这一点。如果您只传递要更新的数据,如下所示:

shippings = [{
  labelUrl: 'example.com',
  custom: 'test
}]

如果您对其他列有

NOT NULL
约束,它将不起作用,因为该列不存在于“插入”数据中。

有没有一种干净的方法来绕过这个?或者也许另一种方法可以快速更新具有不同数据的多行?

postgresql sequelize.js
1个回答
0
投票

我认为 Sequelize 本身并不支持您想要的内容 - 正如您注意到的那样,bulkCreate 需要所有不可为空的值,因为它实际上会创建缺失的行,并更新现有的行。

替代方案:

  • 有一个

    model.update(values, {where:})
    方法,但这意味着为所有目标行设置相同的值,这可能不是您想要的。

  • 您可以并行执行多个更新(如果需要,使用事务):

await Promise.all(shippings.map(elt => models.Shipping.update(elt, { where: { id: elt.id }, transaction })
  • 如果您真的想要一个查询,那么您可能可以编写一个自定义原始查询,为每个运输项目使用生成的 CASE 块,但我不确定它是否会更有效,查询可能会很重。
© www.soinside.com 2019 - 2024. All rights reserved.