以下脚本是借鉴 chenshenhai 大佬的 Koa 教程中的代码,并对其进行修改。整个初始化步骤作为记录,方便以后快速查阅。
目录结构:
1-sql 2 - data.sql 3 - user.sql 4- db 5 - mysql_config.js // 数据库配置 6 - async_db.js // 数据库的查询和初始化函数 7- util 8 - get_sql_content_map.js 对sql目录下的 .sql文件内容读取并组合成 Map 映射关系 9 - get_sql_map.js 10 - walk_file.js 11- index.js // 初始化入口文件
sql 目录下
data.sql
1CREATE TABLE IF NOT EXISTS `data` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `data_info` json DEFAULT NULL, 4 `create_time` varchar(20) DEFAULT NULL, 5 `modified_time` varchar(20) DEFAULT NULL, 6 `level` int(11) DEFAULT NULL, 7 PRIMARY KEY (`id`) 8) ENGINE=InnoDB DEFAULT CHARSET=utf8
user.sql
1CREATE TABLE IF NOT EXISTS `user` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `email` varchar(255) DEFAULT NULL, 4 `password` varchar(255) DEFAULT NULL, 5 `name` varchar(255) DEFAULT NULL, 6 `nick` varchar(255) DEFAULT NULL, 7 `detail_info` json DEFAULT NULL, 8 `create_time` varchar(20) DEFAULT NULL, 9 `modified_time` varchar(20) DEFAULT NULL, 10 `level` int(11) DEFAULT NULL, 11 PRIMARY KEY (`id`) 12) ENGINE=InnoDB DEFAULT CHARSET=utf8; 13 14INSERT INTO `user` set email='1@example.com', password='123456'; 15INSERT INTO `user` set email='2@example.com', password='123456'; 16INSERT INTO `user` set email='3@example.com', password='123456';
util 目录下
walk_file.js
1// 遍历sql脚本文件 2const fs = require("fs"); 3const path = require("path"); 4 5module.exports = waleFile; 6 7/** 8 * 9 * @param {String} pathResolve 10 * @param {String} mime 文件后缀名 11 */ 12function waleFile(pathResolve, mime) { 13 const files = fs.readdirSync(pathResolve); 14 15 const fileList = {}; 16 17 for (let [i, item] of files.entries()) { 18 const ext = path.extname(item).replace(/\./, ""); 19 if (ext === mime) { 20 fileList[item] = path.join(pathResolve, item); 21 } 22 } 23 24 return fileList; 25}
get_sql_map.js
1/** 2 获取所有sql脚本文件 3*/ 4const path = require("path"); 5const waleFile = require("./walk_file"); 6 7/** 8 * @returns {Object} 9 */ 10function getSqlMap() { 11 debugger; 12 // 当前模块所在的目录地址 13 const sqlPath = path.resolve(__dirname, "..", "sql"); 14 15 return waleFile(sqlPath, "sql"); 16} 17 18module.exports = getSqlMap;
get_sql_content_map.js
1/** 2 获取 sql脚本文件内容 3*/ 4const fs = require("fs"); 5const getSqlMap = require("./get_sql_map"); 6 7const sqlContentMap = {}; 8 9function getSqlContent(fileName, path) { 10 let content = fs.readFileSync(path, "binary"); 11 sqlContentMap[fileName] = content; 12} 13 14function getSqlContentMap() { 15 const sqlMap = getSqlMap(); 16 for (let key in sqlMap) { 17 getSqlContent(key, sqlMap[key]); 18 } 19 20 return sqlContentMap; 21} 22 23module.exports = getSqlContentMap;
db目录下
对数据库连接和异步查询的封装
mysql_config.js
1const mysql = require("mysql"); 2 3(function() { 4 // 创建数据库会话 5 let connection; 6 7 const connect_mysql = () => { 8 connection = mysql.createConnection({ 9 host: "127.0.0.1", 10 user: "root", 11 password: "abc123", 12 database: "koa_demo" 13 }); 14 }; 15 16 const getConnection = () => connection; 17 18 module.exports = { getConnection, connect_mysql }; 19})();
async_db.js
1const { getConnection } = require("./mysql_config"); 2 3const find = sql => { 4 return new Promise((resolve, reject) => { 5 getConnection().query(sql, (err, results, fileds) => { 6 if (err) return reject(err); 7 8 resolve({ 9 results, 10 fileds 11 }); 12 }); 13 }); 14}; 15 16module.exports = { 17 find 18};
index.js 初始化入口文件
1const fs = require("fs"); 2const getSqlContentMap = require("./util/get_sql_content_map"); 3const { connect_mysql } = require("./db/mysql_config"); 4const { find } = require("./db/async_db"); 5 6connect_mysql(); 7 8// 打印脚本执行日志 9const eventLog = function(err, sqlFile, index) { 10 if (err) { 11 console.log( 12 `[ERROR] sql脚本文件: ${sqlFile} 第${index + 1}条脚本 执行失败 o(╯□╰)o !` 13 ); 14 } else { 15 console.log( 16 `[SUCCESS] sql脚本文件: ${sqlFile} 第${index + 17 1}条脚本 执行成功 O(∩_∩)O !` 18 ); 19 } 20}; 21 22// 获取所有sql脚本内容 23const sqlContentMap = getSqlContentMap(); 24 25const createAllTables = async () => { 26 // key sql 名 27 for (let key in sqlContentMap) { 28 let sqlShell = sqlContentMap[key]; 29 let sqlShellList = sqlShell.split(";"); 30 31 for (let [i, shell] of sqlShellList.entries()) { 32 // 去除 .sql 文件中的注释内容 33 shell = shell.replace(/(\/\/.*)|(\/\*[\s\S]*?\*\/)/g, ""); 34 if ((shell = shell.trim())) { 35 const { results } = await find(shell); 36 if (results.serverStatus * 1 === 2) { 37 eventLog(null, key, i); 38 } else { 39 eventLog(true, key, i); 40 } 41 } 42 } 43 } 44 45 console.log("sql脚本执行结束"); 46 console.log("请按 ctrl + c 键退出!"); 47}; 48 49createAllTables();
执行 index.js 脚本, 如果在 sql文件书写正确的情况下: 

结语
通过这种方式, 我们可以初始化数据库的表结构和初始化数据。根据不同的业务场景, 在 sql 目录下创建不同的 sql 文件并通过 index.js 来初始化就可以了。