如下腳本是借鑑 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