背景
navicat是mysql可視化工具中最棒的,但是,在處理視圖的導(dǎo)入導(dǎo)出方面,它是按照視圖名稱的字母順序來處理的,若視圖存在依賴,在導(dǎo)入過程中就會報錯。前面已經(jīng)用python寫了一個,但在使用過程中,遇到xfffd編碼,python的pymysql會直接崩潰。發(fā)現(xiàn)golang沒有這個問題,正好用go重寫,來熟悉golang。
一些關(guān)鍵點
代碼解析
按功能模塊對核心代碼進(jìn)行說明
main.go,并發(fā)、命令行參數(shù)
使用命令行參數(shù),接受一個參數(shù),來指定備份的內(nèi)容
package common
| type OpFlag struct { Tables bool //表結(jié)構(gòu) Datum bool //表結(jié)構(gòu)和數(shù)據(jù) Views bool //視圖 Funcs bool //函數(shù)與存儲過程} |
main.go,程序入口,處理命令行參數(shù)
| if len(os.Args) > 1 { flag = common.OpFlag{ Tables: false, Datum: false, Views: false, Funcs: false, } switch os.Args[1] { //接受一個參數(shù) case "table": flag.Tables = true //根據(jù)參數(shù)設(shè)定標(biāo)識量 case "data": flag.Tables = true flag.Datum = true case "views": flag.Views = true case "funcs": flag.Funcs = true default: //參數(shù)不正確,報錯退出 log.Fatal("You arg must be in : table, data, views or funcs.") } }else{ //無參數(shù),默認(rèn)導(dǎo)出所有 flag = common.OpFlag{ Tables: true, Datum: true, Views: true, Funcs: true, } } err := backUp.Export(flag) 根據(jù)參數(shù)進(jìn)行數(shù)據(jù)庫備份 |
Export.go
備份主流程,根據(jù)configs.json生成goroutine來備份數(shù)據(jù)庫,并等待完成。
| var configs interface{} fr, err := os.Open("./configs.json") if err != nil { return err } decoder := json.NewDecoder(fr) //解析配置文件 err = decoder.Decode(&configs) confs := configs.(map[string]interface{}) workDir := confs["workDir"].(string) ch := make(chan string) //通道變量 for key, value := range confs { if strings.HasPrefix(key, "db_") { dbConf := value.(map[string]interface{}) dbConn := common.DbConnFields{ //數(shù)據(jù)庫相應(yīng)配置 DbHost: dbConf["db_host"].(string), DbPort: int(dbConf["db_port"].(float64)), DbUser: dbConf["db_user"].(string), DbPass: dbConf["db_pass"].(string), DbName: dbConf["db_name"].(string), DbCharset: dbConf["db_charset"].(string), } if dbConf["file_alias"] != nil { //生成sql備份文件的命名 dbConn.FileAlias = dbConf["file_alias"].(string) } go ExportOne(dbConn, workDir, ch, flag) //創(chuàng)建協(xié)程 } } for key := range confs { //阻塞主進(jìn)程,待所有協(xié)程完成工作 if strings.HasPrefix(key, "db_") { fmt.Print( <- ch ) } } return nil |