美文网首页Golang 入门资料+笔记
go程序启动时执行安装install初始化数据

go程序启动时执行安装install初始化数据

作者: 五岁小孩 | 来源:发表于2021-02-27 14:41 被阅读0次

go程序启动时执行安装install初始化数据

目的

程序启动执行install 安装初始化程序,如初始化mysql表,表基础数据

代码

在源目录下创建commands目录,在commands目录下创建install.go

代码如下:

package commands

import (
    "bufio"
    "eastwan.com/xy-icnc/dao"
    "eastwan.com/xy-icnc/model"
    "errors"
    "fmt"
    "github.com/astaxie/beego/logs"
    "github.com/jinzhu/gorm"
    "io/ioutil"
    "os"
    "path"
    "strings"
)

func init() {
    logs.Debug("package commands init()...")
    //获取启动参数
    if len(os.Args) >= 2 {
        switch os.Args[1] {
        case "install":
            //当启动参数的第一个参数为install时
            //如: ./test install
            Install()
            //结束后,终止程序
            os.Exit(0)
            return
        }
    }
    //TODO 模拟操作
    //Install()
    //os.Exit(0)
}
func Install() {
    //初始化mysql
    if err := InitMysql(); err != nil {
        logs.Error("系统初始化mysql失败,%v", err.Error())
    }
}

//在执行参数 install时初始化数据库,表以及表数据
func InitMysql() error {
    var err error
    var gormDB *gorm.DB
    //1.创建数据库
    var optDBName = "mysql"
    var createDBConn *gorm.DB
    var connectParam = dao.DBConfig.MysqlParam + "&multiStatements=true"
    dbConnStr := fmt.Sprintf("%s:%s@(%s)/%s?%s", dao.DBConfig.MysqlUser, dao.DBConfig.MysqlPass, dao.DBConfig.MysqlHost, optDBName, connectParam)
    createDBConn, err = gorm.Open("mysql", dbConnStr)
    if err != nil {
        logs.Error("Mysql init connect error:%v", err.Error())
        return err
    }
    var sqlStr = fmt.Sprintf("CREATE DATABASE %s DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;",
        dao.DBConfig.MysqlDBName)
    gormDB = createDBConn.Exec(sqlStr)
    if gormDB.Error != nil {
        logs.Error("create mysql 数据库(%s) 失败,%v", dao.DBConfig.MysqlDBName, gormDB.Error.Error())
        if !strings.Contains(fmt.Sprintf("%s", gormDB.Error.Error()), "database exists") {
            return gormDB.Error
        }
        fmt.Printf("## 当前数据库(%s)已存在,是否仍然执行*.sql脚本,该操作会进行表重建导致数据丢失\n", dao.DBConfig.MysqlDBName)
        fmt.Printf("## 请输入确认?[y/n]:")
        input := bufio.NewScanner(os.Stdin)
        input.Scan()
        if input.Text() != "y" {
            fmt.Printf("\n运行结束......\n")
            return nil
        }
        fmt.Printf("\n")
    }
    //该连接记得关闭,目的是为了创建连接以至于可以创建本项目所需的数据库
    //但是由于操作的数据库是mysql自带的数据库mysql(当前未找到合适的连接数据库),存在操作风险
    _ = createDBConn.Close()

    //2.创建表以及创建基础数据
    optDBName = dao.DBConfig.MysqlDBName
    var db *gorm.DB
    connectParam = dao.DBConfig.MysqlParam + "&multiStatements=true"
    dbConnStr = fmt.Sprintf("%s:%s@(%s)/%s?%s", dao.DBConfig.MysqlUser, dao.DBConfig.MysqlPass, dao.DBConfig.MysqlHost, optDBName, connectParam)
    db, err = gorm.Open("mysql", dbConnStr)
    if err != nil {
        logs.Error("Mysql init connect error:%v", err.Error())
        return err
    }
    //读取sql目录下的.sql文件并且执行
    sqlDirPath := model.WebConfig.ResourcePath + "/sql"
    fileInfo, err := os.Stat(sqlDirPath)
    if err != nil || !fileInfo.IsDir() {
        return errors.New("sql 脚本 不存在")
    }
    //读取脚本目录下所有的sql脚本
    files, err := ioutil.ReadDir(sqlDirPath)
    if err != nil {
        return err
    }
    if len(files) <= 0 {
        return errors.New("sql 脚本 不存在")
    }

    for _, fileInfo := range files {
        if fileInfo.IsDir() {
            //结束本层循环
            continue
        }
        //获取文件名称带后缀
        fileNameWithSuffix := path.Base(fileInfo.Name())
        //获取文件的后缀(文件类型)
        fileType := path.Ext(fileNameWithSuffix)
        //获取文件名称(不带后缀)
        //fileNameOnly := strings.TrimSuffix(fileNameWithSuffix, fileType)
        if fileType != ".sql" {
            //结束本层循环
            continue
        }
        fileBytes, err := ioutil.ReadFile(path.Join(sqlDirPath, fileNameWithSuffix))
        if err != nil {
            //结束本层循环
            continue
        }
        fmt.Printf("正在执行%s脚本....\n", fileInfo.Name())
        //执行sql文件
        //andExtFromBytes := stripCtlAndExtFromBytes(string(fileBytes))
        gormDB := db.Exec(string(fileBytes))
        if gormDB.Error != nil {
            logs.Error("%s导入失败:%v", fileInfo.Name(), gormDB.Error)
        }
        fmt.Printf("%s脚本执行结束....\n", fileInfo.Name())
    }
    ////mysql初始化结束后重新连接mysql,若该步骤在mysql创建连接之前则可省略
    //dao.InitDBConnect()
    return err
}

备注:.sql脚本文件需放在attachment/sql下,且 .sql脚本的顺序需要特别注意

相关文章

网友评论

    本文标题:go程序启动时执行安装install初始化数据

    本文链接:https://www.haomeiwen.com/subject/svugxltx.html