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


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

  • 相关阅读:
    今天 弄了一下ajax 里面的
    重修理解了一下js 控制treeview 菜单的子级和父级的关系 理解的还不够全 因为 html不够全 但是加个注释吧
    xml .net 用法
    这几天在做把数据库里的数据 导出 并且压缩 学到了一些东西
    今天实现了用按钮后台动态实现了 table里面内容的显示和隐藏 在实现过程中了解了updatepanel的简单的用法
    今天第一次参加了软件产品的讨论会议 收获
    收藏个debug的文章
    Animate.css
    flash遨游缓存问题
    URL短地址压缩算法 微博短地址原理解析 (Java实现)
  • 原文地址:https://www.cnblogs.com/qiqingfu/p/12548000.html
Copyright © 2020-2023  润新知