使用node.js将json格式数据导入MySQL

使用MySQL创建一个数据库, 使用node.js从一个已有的json数据格式的文件生成一个MySQL可以导入的txt文件, 并导入新数据库中.

有时我们为了简便, 使用json格式文件保存了一些数据. 但是随着数据量增加, 使用json文件存储的数据不仅查询起来不方便, 在增删时更是充满风险. 现在我们希望把这些数据转移到MySQL数据库中, 以便访问和管理.

MySQL提供了一种简单的命令从具有特定格式的txt文件中导入数据. 在这个文件里, 不同的列使用\t分隔, 用\N表示缺失的值(NULL). 1

我们使用node.js工具将json格式文件转换为MySQL格式可导入的txt文件.

前期的准备工作

todo.json中有这样一段数据:

[
  {
    
    
    "todo":"早上7:00起","startDate":"2021-01-03T17:53:38.565354",
    "id":1,
    "isArchived":true
  }, {
    
    
    "todo":"第一个跑到学院楼","startDate":"2021-01-03T20:12:06.787177",
    "id":2,
    "isArchived":true
  }, {
    
    
    "todo":"单手杵地平板支撑","startDate":"2021-01-03T20:20:02.103439",
    "id":3,
    "isArchived":false
  }
]

可以看到, 共有3条数据, 每一条数据中包含4项: todo, startDate, id, isArchived. 其中, todo描述一项工作, 使用字符串表示; startDate表示添加该工作的时间, 精确到μs, 格式是YYYY-MM-DD hh-mm-ss.uuuuuu; id是一个唯一标识, 用整数表示; 而isArchived表示是否已完成该工作, 用bool值表示.

MySQL要求预先创建数据类型已知的数据表. 因此, 我们先建立一个这样的表.

首先, 进入MySQL的命令行程序.

mysql -u root -p

在mysql中, 创建一个新的数据库test, 然后, 应用该数据库.

create database test;
use test;

然后, 依据我们的json数据, 创建一个新的表todo, 并将id设置为自增的主键.

create table todo (
  id int not null auto_increment, 
  todo varchar(128) not null, 
  isArchived tinyint default 0, 
  startDate datetime, 
  primary key(id)
);

使用describe todo;命令可以查看创建的表的类型.

mysql> describe todo;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| todo       | varchar(128) | NO   |     | NULL    |                |
| isArchived | tinyint(4)   | YES  |     | 0       |                |
| startDate  | datetime     | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
4 rows in set (0.03 sec)

这里需要注意: 1. MySQL中的datetime类型格式默认为YYYY-MM-DD hh-mm-ss, 秒后没有小数部分; 2. MySQL中没有bool类型, 一般用0表示false, 用1表示true.

这样, 准备工作就基本上完成了.

使用node.js处理数据

文件转换使用node.js来完成, 主要包括一下工作:

  1. 读入数据;
  2. 针对特殊数据类型(bool, datetime)处理数据;
  3. 转换数据的格式;
  4. 保存数据;

接下来依次完成这些工作.

读入数据

node.js自带了fs模块读写文件.

// transform-json-to-txt-for-mysql.js
const fs = require("fs");
fs.readFile("todo.json", (err, data) => {
    
    
  let todotxt = convertJSON2TXT(data); // 处理数据
  saveTXT(todotxt); // 保存数据
});

function convertJSON2TXT(data) {
    
    
  let todotxt = "";
  // TODO 针对特殊数据类型处理数据

  // TODO 转换数据格式

  return todotxt;
}

function saveTXT(todotxt) {
    
    
  // 保存数据
}

我们在convertJSON2TXT函数中处理数据, 然后使用saveTXT保存数据.

针对特殊数据类型处理数据

在这一部分, 我们将原json文件中startDate这一项的数据(例如"2021-01-03T17:53:38.565354")处理为MySQL中的datetime类型默认格式, 即"YYYY-MM-DD hh-mm-ss". 首先将原数据中的"T"变为空格" ", 然后删除最后7位(".565354").

接下来, 对于isArchived这一项, 用0表示false, 用1表示true.

function convertJSON2TXT(data) {
    
    
  let todotxt = '';
  // 针对特殊数据类型处理数据
  let todo = JSON.parse(data.toString());
  todo.forEach((val) => {
    
    
    val.isArchived = val.isArchived ? 1 : 0;
    val.startDate = val.startDate.replace("T", " ").substr(0, 19);
  });
  // TODO 转换数据格式

  return todotxt;
}

todo中保存了已被处理的数据.

转换数据格式

这里, 我们使用\t分隔不同的列. 同时要注意列的顺序与MySQL的表todo中列的顺序相同, 行结尾用\r\n分割.

function convertJSON2TXT(data) {
    
    
  let todotxt = '';
  // 针对特殊数据类型处理数据
  let todo = JSON.parse(data.toString());
  todo.forEach((val) => {
    
    
    val.isArchived = val.isArchived ? 1 : 0;
    val.startDate = val.startDate.replace("T", " ").substr(0, 19);
  });
  // TODO 转换数据格式
  todo.forEach((val) => {
    
    
    todotxt += `${
      
      val.id}\t${
      
      val.todo}\t${
      
      val.isArchived}\t${
      
      val.startDate}\r\n`;
  })

  return todotxt.substr(0, todotxt.length - 2); // 去掉多余的行
}

保存数据

这里, 保存数据同样使用fs模块实现.

function saveTXT(todotxt) {
    
    
  // 保存数据
  fs.writeFile("todo.txt", todotxt, (err) => {
    
    
    if (err) {
    
    
      console.log("error occurs");
    } else {
    
    
      console.log("write to todo.txt:");
      console.log(todotxt);
    }
  });
}

最终文件可以在我的GitHub仓库中查看. 2

运行文件, 即可生成文件todo.txt.

$ node transform-json-to-txt-for-mysql.js
write to todo.txt:
1	早上7:00起	1	2021-01-03 17:53:38
2	第一个跑到学院楼	1	2021-01-03 20:12:06
3	单手杵地平板支撑	0	2021-01-03 20:20:02

导入文件

MySQL命令行中, 导入todo.txt到表todo.

load data local infile './todo.txt' into table todo;

注意应从todo.txt文件同级目录下进入mysql命令行程序, 或者指定todo.txt文件的绝对路径.

load data local infile '/path/to/todo.txt' into table todo;

检查一下已经录入的数据.

mysql> select * from todo;
+----+--------------------------+------------+---------------------+
| id | todo                     | isArchived | startDate           |
+----+--------------------------+------------+---------------------+
|  1 | 早上7:00起               |          1 | 2021-01-03 17:53:38 |
|  2 | 第一个跑到学院楼         |          1 | 2021-01-03 20:12:06 |
|  3 | 单手杵地平板支撑         |          0 | 2021-01-03 20:20:02 |
+----+--------------------------+------------+---------------------+
3 rows in set (0.00 sec)

  1. https://dev.mysql.com/doc/refman/8.0/en/loading-tables.html ↩︎

  2. 全部代码 ↩︎

猜你喜欢

转载自blog.csdn.net/weixin_41231535/article/details/113920062