Koa 连接mysql数据,mysql数据库表初始化脚本

以下脚本是借鉴 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 来初始化就可以了。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )