You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_idVARCHAR(255)对应JSON里的id,设为主键
    sizeVARCHAR(255)对应JSON里的size
    totalVARCHAR(255)对应JSON里的total
    group_nameVARCHAR(255)对应JSON里的group(因为group是MySQL关键字,换个名字避免冲突)
  • 子表(比如叫result_data):存储每个result下的data数组元素,通过result_id关联主表

    字段名类型说明
    idINT自增主键
    result_idVARCHAR(255)外键,关联主表的result_id
    dateVARCHAR(255)对应JSON里的date
    ageVARCHAR(255)对应JSON里的age
    gradeVARCHAR(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:57:19