以下腳本是借鑒 chenshenhai
大佬的 Koa 教程中的代碼,並對其進行修改。整個初始化步驟作為記錄,方便以后快速查閱。
目錄結構:
-sql
- data.sql
- user.sql
- db
- mysql_config.js // 數據庫配置
- async_db.js // 數據庫的查詢和初始化函數
- util
- get_sql_content_map.js 對sql目錄下的 .sql文件內容讀取並組合成 Map 映射關系
- get_sql_map.js
- walk_file.js
- index.js // 初始化入口文件
sql 目錄下
data.sql
CREATE TABLE IF NOT EXISTS `data` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`data_info` json DEFAULT NULL,
`create_time` varchar(20) DEFAULT NULL,
`modified_time` varchar(20) DEFAULT NULL,
`level` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
user.sql
CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`nick` varchar(255) DEFAULT NULL,
`detail_info` json DEFAULT NULL,
`create_time` varchar(20) DEFAULT NULL,
`modified_time` varchar(20) DEFAULT NULL,
`level` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `user` set email='1@example.com', password='123456';
INSERT INTO `user` set email='2@example.com', password='123456';
INSERT INTO `user` set email='3@example.com', password='123456';
util 目錄下
walk_file.js
// 遍歷sql腳本文件
const fs = require("fs");
const path = require("path");
module.exports = waleFile;
/**
*
* @param {String} pathResolve
* @param {String} mime 文件后綴名
*/
function waleFile(pathResolve, mime) {
const files = fs.readdirSync(pathResolve);
const fileList = {};
for (let [i, item] of files.entries()) {
const ext = path.extname(item).replace(/\./, "");
if (ext === mime) {
fileList[item] = path.join(pathResolve, item);
}
}
return fileList;
}
get_sql_map.js
/**
獲取所有sql腳本文件
*/
const path = require("path");
const waleFile = require("./walk_file");
/**
* @returns {Object}
*/
function getSqlMap() {
debugger;
// 當前模塊所在的目錄地址
const sqlPath = path.resolve(__dirname, "..", "sql");
return waleFile(sqlPath, "sql");
}
module.exports = getSqlMap;
get_sql_content_map.js
/**
獲取 sql腳本文件內容
*/
const fs = require("fs");
const getSqlMap = require("./get_sql_map");
const sqlContentMap = {};
function getSqlContent(fileName, path) {
let content = fs.readFileSync(path, "binary");
sqlContentMap[fileName] = content;
}
function getSqlContentMap() {
const sqlMap = getSqlMap();
for (let key in sqlMap) {
getSqlContent(key, sqlMap[key]);
}
return sqlContentMap;
}
module.exports = getSqlContentMap;
db目錄下
對數據庫連接和異步查詢的封裝
mysql_config.js
const mysql = require("mysql");
(function() {
// 創建數據庫會話
let connection;
const connect_mysql = () => {
connection = mysql.createConnection({
host: "127.0.0.1",
user: "root",
password: "abc123",
database: "koa_demo"
});
};
const getConnection = () => connection;
module.exports = { getConnection, connect_mysql };
})();
async_db.js
const { getConnection } = require("./mysql_config");
const find = sql => {
return new Promise((resolve, reject) => {
getConnection().query(sql, (err, results, fileds) => {
if (err) return reject(err);
resolve({
results,
fileds
});
});
});
};
module.exports = {
find
};
index.js 初始化入口文件
const fs = require("fs");
const getSqlContentMap = require("./util/get_sql_content_map");
const { connect_mysql } = require("./db/mysql_config");
const { find } = require("./db/async_db");
connect_mysql();
// 打印腳本執行日志
const eventLog = function(err, sqlFile, index) {
if (err) {
console.log(
`[ERROR] sql腳本文件: ${sqlFile} 第${index + 1}條腳本 執行失敗 o(╯□╰)o !`
);
} else {
console.log(
`[SUCCESS] sql腳本文件: ${sqlFile} 第${index +
1}條腳本 執行成功 O(∩_∩)O !`
);
}
};
// 獲取所有sql腳本內容
const sqlContentMap = getSqlContentMap();
const createAllTables = async () => {
// key sql 名
for (let key in sqlContentMap) {
let sqlShell = sqlContentMap[key];
let sqlShellList = sqlShell.split(";");
for (let [i, shell] of sqlShellList.entries()) {
// 去除 .sql 文件中的注釋內容
shell = shell.replace(/(\/\/.*)|(\/\*[\s\S]*?\*\/)/g, "");
if ((shell = shell.trim())) {
const { results } = await find(shell);
if (results.serverStatus * 1 === 2) {
eventLog(null, key, i);
} else {
eventLog(true, key, i);
}
}
}
}
console.log("sql腳本執行結束");
console.log("請按 ctrl + c 鍵退出!");
};
createAllTables();
執行 index.js 腳本, 如果在 sql文件書寫正確的情況下:
結語
通過這種方式, 我們可以初始化數據庫的表結構和初始化數據。根據不同的業務場景, 在 sql 目錄下創建不同的 sql 文件並通過 index.js 來初始化就可以了。