如何用Node.js和Express将JSON数组批量插入MySQL数据库?
解决MySQL批量插入JSON数组所有记录的问题
你的问题出在SQL语句的写法上:INSERT INTO products SET ?是单条插入的语法,当你传入数组时,mysql驱动只会解析数组的第一个元素,所以只插入了第一条记录。要实现批量插入,需要改用MySQL的批量插入语法,并调整数据格式。
修改后的代码示例
const { readFileSync } = require('fs'); const products = JSON.parse(readFileSync('./Zahabi-Products.json', 'utf8')); // 1. 定义要插入的列名(需与JSON对象的字段一一对应) const columns = ['DESCRIPTION', 'TYPE', 'CLASSIFICATION', 'BRAND', 'ORIGIN', 'FAMILY', 'ar_classification']; // 2. 将JSON数组转换为批量插入需要的二维数组格式 const values = products.map(product => columns.map(col => product[col])); // 3. 执行批量插入 pool.query( `INSERT INTO products (${columns.join(', ')}) VALUES ?`, [values], function(err, result) { if (err) throw err; console.log(`成功插入 ${result.affectedRows} 条记录`); } );
关键说明
- SQL语法调整:
INSERT INTO 表名 (列1,列2...) VALUES ?是MySQL批量插入的标准语法,?会被替换为二维数组对应的多行值。 - 数据格式转换:
map方法将每个JSON对象转换成对应列的值数组,最终形成[[值1,值2...], [值1,值2...]]的二维数组,这是mysql驱动要求的批量插入参数格式。 - 字段一致性:确保
columns数组中的列名和数据库表的列名完全一致,且顺序和values数组中的值顺序对应,否则会出现字段值不匹配的问题。
额外注意事项
- 若你的JSON对象存在字段缺失的情况,可在
map时添加默认值(比如product[col] || ''),避免插入空值报错(根据你的表字段是否允许null调整)。 - 对于1000条记录的规模,直接批量插入即可;如果记录数上万,建议分批次插入(比如每500条一批),避免超出MySQL的
max_allowed_packet限制。
内容的提问来源于stack exchange,提问作者Abdullah Manafikhi
相关产品推荐
相关产品推荐

