使用node.js将json格式数据导入MySQL 您所在的位置:网站首页 node爬取数据存储到mysql 使用node.js将json格式数据导入MySQL

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

2023-07-22 21:31| 来源: 网络整理| 查看: 265

使用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来完成, 主要包括一下工作:

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

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

读入数据

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)

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

全部代码 ↩︎



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有