Node.js新手求助:如何将嵌套JSON对象插入MySQL数据库
解决Node.js中嵌套JSON插入MySQL的问题
嘿,作为Node.js新手遇到嵌套JSON插入MySQL的问题太正常了!我来一步步带你搞定这个事儿,从表结构设计到代码实现都给你讲清楚。
第一步:准备依赖
首先你需要安装支持Promise的MySQL客户端,mysql2是个不错的选择,它比原生的mysql包更适合用async/await写异步代码。在项目根目录运行:
npm install mysql2
第二步:设计数据库表结构
你的JSON是嵌套结构(results数组里每个元素又包含data数组),所以推荐用两张关联表来存储,避免数据冗余:
主表(比如叫
result_groups):存储顶层的results元素和全局的total、group字段字段名 类型 说明 result_id VARCHAR(255) 对应JSON里的 id,设为主键size VARCHAR(255) 对应JSON里的 sizetotal VARCHAR(255) 对应JSON里的 totalgroup_name VARCHAR(255) 对应JSON里的 group(因为group是MySQL关键字,换个名字避免冲突)子表(比如叫
result_data):存储每个result下的data数组元素,通过result_id关联主表字段名 类型 说明 id INT 自增主键 result_id VARCHAR(255) 外键,关联主表的 result_iddate VARCHAR(255) 对应JSON里的 dateage VARCHAR(255) 对应JSON里的 agegrade VARCHAR(255) 对应JSON里的 grade
你可以用以下SQL语句创建这两张表:
CREATE TABLE result_groups ( result_id VARCHAR(255) PRIMARY KEY, size VARCHAR(255), total VARCHAR(255), group_name VARCHAR(255) ); CREATE TABLE result_data ( id INT AUTO_INCREMENT PRIMARY KEY, result_id VARCHAR(255), date VARCHAR(255), age VARCHAR(255), grade VARCHAR(255), FOREIGN KEY (result_id) REFERENCES result_groups(result_id) );
第三步:编写Node.js插入代码
接下来写核心的插入逻辑,用事务保证主表和子表的数据一致性(要么都插入成功,要么都失败),同时用参数化查询防止SQL注入:
const mysql = require('mysql2/promise'); // 引入promise版本的mysql2 // 替换成你自己的数据库配置 const dbConfig = { host: 'localhost', user: '你的MySQL用户名', password: '你的MySQL密码', database: '你的数据库名称' }; async function insertNestedJson(jsonData) { let connection; try { // 建立数据库连接 connection = await mysql.createConnection(dbConfig); // 开启事务 await connection.beginTransaction(); // 遍历results数组中的每个结果项 for (const resultItem of jsonData.results) { // 1. 插入主表 await connection.execute( `INSERT INTO result_groups (result_id, size, total, group_name) VALUES (?, ?, ?, ?)`, [resultItem.id, resultItem.size, jsonData.total, jsonData.group] ); // 2. 批量插入当前结果项对应的data数据(比逐条插入性能更好) if (resultItem.data.length > 0) { // 整理批量插入的参数数组 const dataParams = resultItem.data.map(item => [ resultItem.id, item.date, item.age, item.grade ]); // 生成批量插入的占位符 const placeholders = dataParams.map(() => '(?, ?, ?, ?)').join(','); // 执行批量插入 await connection.execute( `INSERT INTO result_data (result_id, date, age, grade) VALUES ${placeholders}`, dataParams.flat() // 把二维数组转为一维,匹配占位符顺序 ); } } // 提交事务 await connection.commit(); console.log('所有数据插入成功!'); } catch (error) { // 出错时回滚事务 if (connection) await connection.rollback(); console.error('插入失败,已回滚:', error); throw error; // 抛出错误让调用方处理 } finally { // 不管成功失败,都关闭连接 if (connection) await connection.end(); } } // 调用函数,传入你的myjsonobject const myjsonobject = { /* 这里放你要插入的JSON对象 */ }; insertNestedJson(myjsonobject).catch(err => console.error(err));
关键注意事项
- 替换数据库配置:一定要把
dbConfig里的信息改成你自己的MySQL连接信息,不然连不上数据库。 - 关键字处理:如果一定要用
group作为字段名,记得用反引号包裹,比如INSERT INTO ... (`group`) VALUES (?),不过还是建议换个名字避免麻烦。 - 批量插入优化:如果你的
data数组特别大,批量插入比逐条插入能大幅提升性能,上面的代码已经做了这个优化。 - 数据类型:我这里字段都用了
VARCHAR,如果你的age是数字、date是日期类型,可以改成对应的INT、DATE类型,插入时注意数据格式转换。
内容的提问来源于stack exchange,提问作者Pmicezjk
相关产品推荐
相关产品推荐

