使用 mysql2 和 NodeJs 批量插入抛出 500

问题描述

我有一个方法,我想 bulk insert 进入 MysqL。我正在使用 NodeJSMysqL2

我的方法

createWorklog = async ({ sqlArray }) => {
        const sql = `INSERT INTO ${this.tableName}
        (project_id,user_id,date,duration,task,description) VALUES ?`

        const result = await query(sql,[sqlArray])
        const affectedRows = result ? result.affectedRows : 0;

        return affectedRows;
}

其中 sqlArray一个 array of arrays,其中所有子数组的长度都相同。

在这方法调用query 方法是下一个

query = async (sql,values) => {
    return new Promise((resolve,reject) => {
      const callback = (error,result) => {
        if (error) {
          reject(error);
          return;
        }
        resolve(result);
      }
      // execute will internally call prepare and query
      this.db.execute(sql,values,callback);
    }).catch(err => {
      const MysqLErrorList = Object.keys(HttpStatusCodes);
      // convert MysqL errors which in the MysqLErrorList list to http status code
      err.status = MysqLErrorList.includes(err.code) ? HttpStatusCodes[err.code] : err.status;

      throw err;
    });
  }
}

我的问题是 body parameters 没问题(正如我所说,数组数组)但该方法抛出 500

这是否可能因为 execute 中存在 MysqL2 命令?或者是另一个错误的任务。

感谢您的宝贵时间!

编辑

我将方法从使用“执行”更改为“查询”,并且运行良好。

解决方法

这是 execute 中的 querymysql2 方法的一个已知问题

我找到了一个可行的替代方案。

createWorklog = async ({ sqlArray }) => {
        const sql = `INSERT INTO ${this.tableName}
        (project_id,user_id,date,duration,task,description) VALUES ?`

        const result = await query(sql,[sqlArray],true) // adding true for multiple insert
        const affectedRows = result ? result.affectedRows : 0;

        return affectedRows;
}

然后查询可以写成如下

    return new Promise((resolve,reject) => {
      const callback = ...

      if (multiple) this.db.query(sql,values,callback);
            else this.db.execute(sql,callback);

    }).catch(err => {
      ...
...
    });
  }
}

可以在此处找到有关此问题的更多信息 https://github.com/sidorares/node-mysql2/issues/830