Nodejs腳本快速導(dǎo)出MySQL數(shù)據(jù)庫數(shù)據(jù)
說在前面
在數(shù)據(jù)庫管理和數(shù)據(jù)遷移的過程中,常常需要將數(shù)據(jù)庫中的表數(shù)據(jù)和結(jié)構(gòu)進行導(dǎo)出,以便進行備份、共享或在不同環(huán)境中使用。數(shù)據(jù)庫數(shù)據(jù)備份的方法有很多,今天讓我們用 Node.js 來編寫一個腳本,快速從 MySQL 數(shù)據(jù)庫中導(dǎo)出所有表的數(shù)據(jù)和結(jié)構(gòu),并保存為單獨的 SQL 文件。
腳本編寫
1. 模塊引入
const mysql = require("mysql"); const fs = require("fs");
mysql
模塊用于連接和操作MySQL數(shù)據(jù)庫fs
模塊用于文件操作,將數(shù)據(jù)寫入文件。
2. 數(shù)據(jù)庫連接配置
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."); });
定義了數(shù)據(jù)庫連接配置對象dbConfig
,包含主機名、用戶名、密碼和數(shù)據(jù)庫名等信息。然后使用mysql.createConnection
創(chuàng)建數(shù)據(jù)庫連接,并通過connection.connect
方法進行連接,若連接成功則打印相應(yīng)信息。
3. 導(dǎo)出表數(shù)據(jù)和結(jié)構(gòu)的函數(shù)
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!"); } }); } ); } ); }
- 這個函數(shù)接受表名
tableName
作為參數(shù),還有一個可選參數(shù)close
,用于控制是否在導(dǎo)出完成后關(guān)閉數(shù)據(jù)庫連接。 - 首先查詢表的創(chuàng)建語句:
connection.query( `SHOW CREATE TABLE ${tableName}`, (error, results, fields) => { //... } );
然后查詢表中的所有數(shù)據(jù):
connection.query( `SELECT * FROM ${tableName}`, (error, results, fields) => { //... } );
對于查詢到的數(shù)據(jù),將每行數(shù)據(jù)轉(zhuǎn)換為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");
最后將表的創(chuàng)建語句和所有數(shù)據(jù)的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. 執(zhí)行導(dǎo)出操作
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); }); });
通過查詢數(shù)據(jù)庫中的所有表,然后對每個表調(diào)用exportTableData
函數(shù)進行數(shù)據(jù)和結(jié)構(gòu)的導(dǎo)出,當處理到最后一個表時,會根據(jù)exportTableData
函數(shù)的close
參數(shù)設(shè)置來決定是否關(guān)閉數(shù)據(jù)庫連接。
測試
創(chuàng)建數(shù)據(jù)庫
CREATE DATABASE test;
創(chuàng)建表
CREATE TABLE `t_user` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `age` int NOT NULL, PRIMARY KEY (`id`) )
插入數(shù)據(jù)
INSERT INTO t_user (name,age) VALUES ('張三', 25); INSERT INTO t_user (name,age) VALUES ('李四', 24);
導(dǎo)出數(shù)據(jù)
到此這篇關(guān)于Nodejs腳本快速導(dǎo)出MySQL數(shù)據(jù)庫數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Nodejs導(dǎo)出MySQL數(shù)據(jù)庫數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nodejs連接mongodb數(shù)據(jù)庫實現(xiàn)增刪改查
本篇文章主要結(jié)合了nodejs操作mongodb數(shù)據(jù)庫實現(xiàn)增刪改查,包括對數(shù)據(jù)庫的增加,刪除,查找和更新,有興趣的可以了解一下。2016-12-12node+vue實現(xiàn)用戶注冊和頭像上傳的實例代碼
本篇文章主要介紹了node+vue實現(xiàn)用戶注冊和頭像上傳的實例代碼,具有一定的參考價值,有興趣的可以了解一下2017-07-07如何在node.js中使用?JsonWebToken模塊進行token加密
目前在web框架中最流行的身份驗證是使用jsonwebtoken,簡稱jwt.可以設(shè)置加密方式,過期時間,存放個人信息,逆解析,下面這篇文章主要給大家介紹了關(guān)于如何在node.js中使用?JsonWebToken模塊進行token加密的相關(guān)資料,需要的朋友可以參考下2023-03-03Node.js 實現(xiàn)簡單的無侵入式緩存框架的方法
這篇文章主要介紹了Node.js 實現(xiàn)簡單的無侵入式緩存框架的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07NodeJs環(huán)境中NODE_ENV介紹和設(shè)置方法
這篇文章主要給大家介紹了關(guān)于NodeJs環(huán)境中NODE_ENV介紹和設(shè)置的相關(guān)資料,NODE_ENV其實就是環(huán)境變量之一,用于設(shè)置nodejs當前的運行環(huán)境,需要的朋友可以參考下2024-07-07Node.js開發(fā)之套接字(socket)編程入門示例
這篇文章主要介紹了Node.js開發(fā)之套接字(socket)編程,結(jié)合簡單實例形式分析了node.js套接字socket客戶端與服務(wù)器端相關(guān)實現(xiàn)與使用技巧,需要的朋友可以參考下2019-11-11Node.js連接MySQL數(shù)據(jù)庫的操作步驟
在現(xiàn)代 Web 開發(fā)中,與數(shù)據(jù)庫的交互是不可避免的一部分,Node.js提供了許多庫和模塊,使得連接和操作 MySQL 數(shù)據(jù)庫變得相對簡單,本文將介紹如何使用Node.js連接MySQL數(shù)據(jù)庫,并進行一些基本的操作,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下2023-11-11