以下脚本是借鉴 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(/(//.*)|(/*[sS]*?*/)/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 来初始化就可以了。