当前位置: 代码网 > it编程>前端脚本>Node.js > Nodejs脚本快速导出MySQL数据库数据

Nodejs脚本快速导出MySQL数据库数据

2024年11月25日 Node.js 我要评论
说在前面在数据库管理和数据迁移的过程中,常常需要将数据库中的表数据和结构进行导出,以便进行备份、共享或在不同环境中使用。数据库数据备份的方法有很多,今天让我们用 node.js 来编写一个脚本,快速从

说在前面

在数据库管理和数据迁移的过程中,常常需要将数据库中的表数据和结构进行导出,以便进行备份、共享或在不同环境中使用。数据库数据备份的方法有很多,今天让我们用 node.js 来编写一个脚本,快速从 mysql 数据库中导出所有表的数据和结构,并保存为单独的 sql 文件。

脚本编写

1. 模块引入

const mysql = require("mysql");
const fs = require("fs");
  • mysql模块用于连接和操作mysql数据库
  • fs模块用于文件操作,将数据写入文件。

2. 数据库连接配置

const dbconfig = {
  host: "localhost",
  user: "root",
  password: "password",
  database: "test",
};

const connection = mysql.createconnection(dbconfig);

connection.connect((error) => {
  if (error) throw error;
  console.log("successfully connected to the database.");
});

定义了数据库连接配置对象dbconfig,包含主机名、用户名、密码和数据库名等信息。然后使用mysql.createconnection创建数据库连接,并通过connection.connect方法进行连接,若连接成功则打印相应信息。

3. 导出表数据和结构的函数

function exporttabledata(tablename, close = false) {
  connection.query(
    `show create table ${tablename}`,
    (error, results, fields) => {
      if (error) throw error;

      const createtablestatement = results[0]["create table"];

      connection.query(
        `select * from ${tablename}`,
        (error, results, fields) => {
          if (error) throw error;

          const insertstatements = results
            .map((row) => {
              const keys = [],
                values = [];
              object.entries(row).foreach((item) => {
                keys.push(item[0]);
                values.push(`'${item[1]}'`);
              });
              return `insert into ${tablename} (${keys.join(
                ","
              )}) values (${values.join(",")});`;
            })
            .join("\n");

          const sql = `${createtablestatement};\n\n${insertstatements}`;

          fs.writefile(`${tablename}.sql`, sql, (err) => {
            if (err) throw err;
            console.log(`data from ${tablename} exported successfully.`);
            if (close) {
              connection.end();
              console.log("all exported!");
            }
          });
        }
      );
    }
  );
}
  • 这个函数接受表名tablename作为参数,还有一个可选参数close,用于控制是否在导出完成后关闭数据库连接。
  • 首先查询表的创建语句:
connection.query(
  `show create table ${tablename}`,
  (error, results, fields) => {
    //...
  }
);

然后查询表中的所有数据:

connection.query(
  `select * from ${tablename}`,
  (error, results, fields) => {
    //...
  }
);

对于查询到的数据,将每行数据转换为insert into语句:

const insertstatements = results
 .map((row) => {
    const keys = [],
      values = [];
    object.entries(row).foreach((item) => {
      keys.push(item[0]);
      values =append('${item[1]}');
    });
    return `insert into ${tablename} (${keys.join(
      ","
    )}) values (${values.join(",")});`;
  })
 .join("\n");

最后将表的创建语句和所有数据的insert into语句组合起来写入到以表名命名的.sql文件中:

const sql = `${createtablestatement};\n\n${insertstatements}`;

fs.writefile(`${tablename}.sql`, sql, (err) => {
  if (err) throw err;
  console.log(`data from ${tablename} exported successfully.`);
  if (close) {
    connection.end();
    console.log("all exported!");
  }
});

4. 执行导出操作

connection.query("show tables", (error, results, fields) => {
  if (error) throw error;

  results.foreach((result, index) => {
    const tablename = result[`tables_in_${dbconfig.database}`];
    exporttabledata(tablename, index === results.length - 1);
  });
});

通过查询数据库中的所有表,然后对每个表调用exporttabledata函数进行数据和结构的导出,当处理到最后一个表时,会根据exporttabledata函数的close参数设置来决定是否关闭数据库连接。

测试

创建数据库

create database test;

创建表

create table `t_user` (
  `id` int not null auto_increment,
  `name` varchar(255) not null,
  `age` int not null,
  primary key (`id`)
)

插入数据

insert into t_user (name,age) values ('张三', 25);
insert into t_user (name,age) values ('李四', 24);

导出数据

到此这篇关于nodejs脚本快速导出mysql数据库数据的文章就介绍到这了,更多相关nodejs导出mysql数据库数据内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com