ToB企服应用市场:ToB评测及商务社交产业平台

标题: node脚本导出数据库数据 [打印本页]

作者: 风雨同行    时间: 2024-11-5 08:03
标题: node脚本导出数据库数据
说在前面

   在数据库管理和数据迁徙的过程中,常常必要将数据库中的表数据和结构举行导出,以便举行备份、共享或在不怜悯况中使用。数据库数据备份的方法有很多,今天让我们用 Node.js 来编写一个脚本,快速从 MySQL 数据库中导出所有表的数据和结构,并保存为单独的 SQL 文件。
  脚本编写

1. 模块引入

  1. const mysql = require("mysql");
  2. const fs = require("fs");
复制代码

2. 数据库毗连设置

  1. const dbConfig = {
  2.   host: "localhost",
  3.   user: "root",
  4.   password: "password",
  5.   database: "test",
  6. };
  7. const connection = mysql.createConnection(dbConfig);
  8. connection.connect((error) => {
  9.   if (error) throw error;
  10.   console.log("Successfully connected to the database.");
  11. });
复制代码
界说了数据库毗连设置对象dbConfig,包罗主机名、用户名、暗码和数据库名等信息。然后使用mysql.createConnection创建数据库毗连,并通过connection.connect方法举行毗连,若毗连乐成则打印相应信息。
3. 导出表数据和结构的函数

  1. function exportTableData(tableName, close = false) {
  2.   connection.query(
  3.     `SHOW CREATE TABLE ${tableName}`,
  4.     (error, results, fields) => {
  5.       if (error) throw error;
  6.       const createTableStatement = results[0]["Create Table"];
  7.       connection.query(
  8.         `SELECT * FROM ${tableName}`,
  9.         (error, results, fields) => {
  10.           if (error) throw error;
  11.           const insertStatements = results
  12.             .map((row) => {
  13.               const keys = [],
  14.                 values = [];
  15.               Object.entries(row).forEach((item) => {
  16.                 keys.push(item[0]);
  17.                 values.push(`'${item[1]}'`);
  18.               });
  19.               return `INSERT INTO ${tableName} (${keys.join(
  20.                 ","
  21.               )}) VALUES (${values.join(",")});`;
  22.             })
  23.             .join("\n");
  24.           const sql = `${createTableStatement};\n\n${insertStatements}`;
  25.           fs.writeFile(`${tableName}.sql`, sql, (err) => {
  26.             if (err) throw err;
  27.             console.log(`Data from ${tableName} exported successfully.`);
  28.             if (close) {
  29.               connection.end();
  30.               console.log("All exported!");
  31.             }
  32.           });
  33.         }
  34.       );
  35.     }
  36.   );
  37. }
复制代码

  1. connection.query(
  2.   `SHOW CREATE TABLE ${tableName}`,
  3.   (error, results, fields) => {
  4.     //...
  5.   }
  6. );
复制代码

  1. connection.query(
  2.   `SELECT * FROM ${tableName}`,
  3.   (error, results, fields) => {
  4.     //...
  5.   }
  6. );
复制代码

  1. const insertStatements = results
  2. .map((row) => {
  3.     const keys = [],
  4.       values = [];
  5.     Object.entries(row).forEach((item) => {
  6.       keys.push(item[0]);
  7.       values =append('${item[1]}');
  8.     });
  9.     return `INSERT INTO ${tableName} (${keys.join(
  10.       ","
  11.     )}) VALUES (${values.join(",")});`;
  12.   })
  13. .join("\n");
复制代码

  1. const sql = `${createTableStatement};\n\n${insertStatements}`;
  2. fs.writeFile(`${tableName}.sql`, sql, (err) => {
  3.   if (err) throw err;
  4.   console.log(`Data from ${tableName} exported successfully.`);
  5.   if (close) {
  6.     connection.end();
  7.     console.log("All exported!");
  8.   }
  9. });
复制代码
4. 执行导出操纵

  1. connection.query("SHOW TABLES", (error, results, fields) => {
  2.   if (error) throw error;
  3.   results.forEach((result, index) => {
  4.     const tableName = result[`Tables_in_${dbConfig.database}`];
  5.     exportTableData(tableName, index === results.length - 1);
  6.   });
  7. });
复制代码
通过查询数据库中的所有表,然后对每个表调用exportTableData函数举行数据和结构的导出,当处理到末了一个表时,会根据exportTableData函数的close参数设置来决定是否关闭数据库毗连。
测试

创建数据库

  1. CREATE DATABASE test;
复制代码
创建表

  1. CREATE TABLE `t_user` (
  2.   `id` int NOT NULL AUTO_INCREMENT,
  3.   `name` varchar(255) NOT NULL,
  4.   `age` int NOT NULL,
  5.   PRIMARY KEY (`id`)
  6. )
复制代码
插入数据

  1. INSERT INTO t_user (name,age) VALUES ('张三', 25);
  2. INSERT INTO t_user (name,age) VALUES ('李四', 24);
复制代码

导出数据



公众号

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

   




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4