node脚本导出数据库数据

320 阅读3分钟

说在前面

在数据库管理和数据迁移的过程中,常常需要将数据库中的表数据和结构进行导出,以便进行备份、共享或在不同环境中使用。数据库数据备份的方法有很多,今天让我们用 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);

导出数据

公众号

关注公众号『前端也能这么有趣』,获取更多有趣内容。

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。