如下脚本是借鉴 chenshenhai
大佬的 Koa 教程中的代码,并对其进行修改。整个初始化步骤做为记录,方便之后快速查阅。javascript
目录结构:java
-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 // 初始化入口文件
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
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';
// 遍历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; }
/** 获取全部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;
/** 获取 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;
对数据库链接和异步查询的封装mysql
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 }; })();
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 };
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 目录下建立不一样的 sql 文件并经过 index.js 来初始化就能够了。shell