亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

sequelize 更新多行

sequelize 更新多行

HUX布斯 2022-12-02 10:49:36
更新多行,使用批量更新是一個好的解決方案還是類似于下面的代碼?. 我想用 id 和文件名更新所有記錄。我確實嘗試在循環內更新,但遷移掛斷并在此塊中花費太長時間。是因為迭代嗎?還是更新語法有問題?謝謝你。#代碼 for (let i = 0; i < documents.length; i++) {        const prefix = Date.now().toString();        const fileParts = documents[i].filename.split('.');        const finalname = `${fileParts[0]}-${prefix}.${fileParts[1]}`;        // eslint-disable-next-line no-await-in-loop        await queryInterface.sequelize.query(`UPDATE ${EmployeeDocumentsModel.tableName} SET filename='${finalname}' WHERE id=${documents[i].id};`, { transaction });      }#代碼module.exports = {  up: async (queryInterface) => {    const transaction = await queryInterface.sequelize.transaction();    try       const documents = await sequelizeClient.query(        `SELECT id, filename, COUNT(filename) FROM ${EmployeeDocumentsModel.tableName} GROUP BY filename      HAVING COUNT(filename) > 1;`,        { type: QueryTypes.SELECT },      );      // eslint-disable-next-line no-plusplus      for (let i = 0; i < documents.length; i++) {        const prefix = Date.now().toString();        const fileParts = documents[i].filename.split('.');        const finalname = `${fileParts[0]}-${prefix}.${fileParts[1]}`;        // eslint-disable-next-line no-await-in-loop        await queryInterface.sequelize.query(`UPDATE ${EmployeeDocumentsModel.tableName} SET filename='${finalname}' WHERE id=${documents[i].id};`, { transaction });      }      // eslint-disable-next-line no-unused-vars      // const file = await sequelizeClient.query(      //   `DELETE d1 from ${EmployeeDocumentsModel.tableName} d1 inner join ${EmployeeDocumentsModel.tableName} d2 on d2.id < d1.id and d2.filename = d1.filename and d2.employeeId = d1.employeeId`,      //   { type: QueryTypes.DELETE },      // );
查看完整描述

1 回答

?
白衣非少年

TA貢獻1155條經驗 獲得超0個贊

我認為最大的問題是每次更新都在等待前一次完成:


for (let i = 0; i < documents.length; i++) {

    // ...

    await queryInterface.sequelize.query(`UPDATE ${EmployeeDocumentsModel.tableName} SET filename='${finalname}' WHERE id=${documents[i].id};`, { transaction });

}

如果將其更改為:


const promises = [];

for (let i = 0; i < documents.length; i++) {

    // ...

    promises.push(queryInterface.sequelize.query(`UPDATE ${EmployeeDocumentsModel.tableName} SET filename='${finalname}' WHERE id=${documents[i].id};`, { transaction }));

}

await Promise.all(promises);

你應該看到一個很大的加速。


查看完整回答
反對 回復 2022-12-02
  • 1 回答
  • 0 關注
  • 306 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號