说在前面
在数据库管理和数据迁徙的过程中,常常必要将数据库中的表数据和结构举行导出,以便举行备份、共享或在不怜悯况中使用。数据库数据备份的方法有很多,今天让我们用 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 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);
复制代码
导出数据
公众号
关注公众号『前端也能这么有趣』,获取更多有趣内容。
说在后面
|