【问题标题】:Update several records at once with different values with sequelize使用 sequelize 一次用不同的值更新多条记录
【发布时间】:2021-06-25 01:39:59
【问题描述】:

我有一个 RESTful API。我正在尝试用不同的值更新保存在我的 MySQL 数据库中的几条记录。我正在通过 Sequelize 开发它。

const input = [
  {
    id: 'id-1',
    field1: 'data0',
    field2: 'data1',
    field3: 'data2',
  }, 
  {
    id: 'id-2',
    field1: 'data3',
    field2: 'data4',
    field3: 'data5',
  },
];
 
for (let i = 0; i < input.length; i++) {
  const element = input[i];

  await <database_manager>.<name-table>.update(element,
    { where: { id: element.id } },
  );
}

有没有更好的方法来实现这种类型的更新?还是循环是更好的方法?

【问题讨论】:

标签: javascript mysql node.js express sequelize.js


【解决方案1】:

要一次更新多条记录(来自同一个表/模型),您可以使用Model.bulkUpdate()。请注意,默认情况下,批量挂钩将运行,但“个人”挂钩不会运行,除非您在选项中指定 individualHooks: true。您可能还想指定validate: true 来触发任何自定义验证器。

如果您想同时更新多个表/模型,您应该将它们传递给Promise.all() 以异步解决它们。关于您问题中的示例-您通常希望避免在for 循环中使用await。这将导致它顺序运行 Promise(它们是异步的),从而有效地使它们同步。如果每个 db 调用需要 1 秒,而你做了 3 秒,那么总时间将是 ~3 秒。如果您使用以下代码同时运行它们,您应该会看到总时间约为 1 秒 - 快了 3 倍。

const inputs = [
  {
    model: 'TableOne',
    data: {
      id: 'id-1',
      field1: 'data0',
      field2: 'data1',
      field3: 'data2',
    },
  },
  {
    model: 'TableTwo',
    data: {
      id: 'id-2',
      field1: 'data3',
      field2: 'data4',
      field3: 'data5',
    },
  },
];

// loop over the inputs and return an array of promises, one for each update
const promises = inputs.map(input) => {
  const { model, data } = input;
  return db[model].update(data, { where: { id: data.id } });
});
// resolve all the db calls at once
await Promise.all(promises);

【讨论】:

  • 非常感谢您的评论,我喜欢最后一段要使用Promise.all。这执行速度非常快并节省资源。我将使用Promise.all。我认为 Model.bulkUpdate 仅在使用 Model.bulkCreate 时才有用,因为我查找了示例并且始终显示,第一次创建和更新后。
猜你喜欢
  • 2014-08-19
  • 2015-01-13
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
相关资源
最近更新 更多