NodeJS中使用mysql2实现MySQL批量插入多条数据的方法
实现批量插入的修改方案
你可以按照如下方案调整代码,兼容单条/多条数据的批量写入,无需客户端多次调用接口:
- 调整参数校验逻辑:先判断接收到的body是否为数组,若为单条对象则自动转为数组统一处理,同时遍历数组内所有元素做字段合法性校验,避免插入中途报错。
- 使用mysql2原生支持的批量插入语法,无需手动拼接SQL,兼顾安全性和写入性能。
- 调整返回结果:批量插入成功后返回写入条数、首条插入ID等信息供客户端使用。
下面是修改后的完整代码:
const mysql = require('mysql2'); const errorCodes = require('source/error-codes'); const PropertiesReader = require('properties-reader'); const prop = PropertiesReader('properties.properties'); // 推荐使用连接池代替单连接,高并发场景下性能更稳定 const pool = mysql.createPool({ host: prop.get('server.host'), user: prop.get("server.username"), password: prop.get("server.password"), port: prop.get("server.port"), database: prop.get("server.dbname"), waitForConnections: true, connectionLimit: 10, queueLimit: 0 }); const promisePool = pool.promise(); exports.saveSellerPortfolioItem = async (event, context, callback) => { context.callbackWaitsForEmptyEventLoop = false; let response; try { // 基础参数校验 if (!event.body) { response = errorCodes.missing_parameters; return callback(null, response); } let body = JSON.parse(event.body); // 兼容单条/多条数据:如果是对象则自动转成单元素数组 const itemList = Array.isArray(body) ? body : [body]; // 批量校验所有字段合法性 const insertParams = []; for (const item of itemList) { const iduser = Number(item.iduser); const title = item.title; const description = item.description; if (isNaN(iduser) || !title || !description) { response = errorCodes.invalid_parameter; return callback(null, response); } insertParams.push([iduser, title, description]); } // 批量插入SQL const sql = "INSERT INTO seller_portfolio_item (iduser, title, description) VALUES ?"; // 执行插入 const [result] = await promisePool.query(sql, [insertParams]); // 构造成功返回 response = { "statusCode": 200, "headers": { "Content-Type": "application/json" }, "body": JSON.stringify({ insertCount: result.affectedRows, firstInsertId: result.insertId // 批量插入的insertId为第一条记录的ID,后续ID依次+1 }), "isBase64Encoded": false }; callback(null, response); } catch (err) { console.log(err.toString()); if (err.toString().indexOf('cannot be null') >= 0) { response = errorCodes.not_null_parameters; } else { response = errorCodes.internal_server_error; } callback(null, response); } };
核心改动说明
- 连接池替代单连接:避免高并发下连接耗尽问题,如果你坚持使用单连接,将
promisePool.query替换为con.query即可,语法完全兼容。 - 入参兼容:自动适配单条对象/数组两种入参格式,原有单条调用的逻辑无需修改。
- 校验前置:所有字段合法性校验在插入前完成,避免部分插入成功、部分失败的脏数据问题。
- 性能优势:批量插入性能远高于循环单条插入,数据量越大提升效果越明显。
如果你不想改用async/await的写法,保持原有的回调逻辑即可,只需要将SQL语句和参数构造部分按上述方案调整就能实现批量插入。
内容的提问来源于stack exchange,提问作者PeakGen
相关产品推荐
相关产品推荐

