配置檔案讀取——MySQL 多個連線

declandragon發表於2019-11-01

前言

記錄自己在學習使用 Go 過程中踩過的坑、解決方案等。

有收穫的話請 點個贊,沒有收穫的話可以 反對 沒有幫助 舉報 三連。

需求

實現一個可以連結多個資料庫的 MySQL 配置檔案讀取 demo

實現

目錄結構

$GOPATH\src
├─demo 
│  ├─conf.json
│  ├─conf.yaml
│  ├─main.go

上程式碼

main.go

// 如果只空行,不寫註釋,格式就亂了,不知道為啥,下面都是這樣的
package main
//
//
import (
    "encoding/json"
    "fmt"
    yaml "gopkg.in/yaml.v3"
    "io/ioutil"
    "os"
)
//
func main()  {
    Json()
    Yaml()
}
//
//
type conn struct {
    Host      string
    Dbname    string
    Username  string
    Password  string
}
//
//
type Config struct {
    Mysql map[string] conn
}
//
//
func Json()  {
    //傳入配置路徑
    file, err := os.Open("./conf.json")
    if err != nil {
        fmt.Println("配置檔案conf.json錯誤", err)
        //錯誤處理
        return
    }
    defer file.Close()

    decoder := json.NewDecoder(file)
    conf := new(Config)
    err = decoder.Decode(&conf)
    if err != nil {
        fmt.Println("解碼錯誤: ", err)
        //錯誤處理
        return
    }
    fmt.Println("json")
    fmt.Println(conf.Mysql)
    //根據欄位需要選擇配置節
    db, ok := conf.Mysql["default"]
    fmt.Println(db)
    fmt.Println(ok)
    if ok {
        fmt.Println(db.Host)
        fmt.Println(db.Dbname)
        fmt.Println(db.Username)
        fmt.Println(db.Password)
    } else {
        fmt.Println("error")
        //錯誤處理
        return
    }

    fmt.Println(conf.Mysql["slave_db01"])
    fmt.Println(conf.Mysql["user_center"])
    fmt.Println(conf.Mysql["data_center"])
}
//
//
func Yaml()  {
    //傳入配置路徑
    yamlFile, err := ioutil.ReadFile("./conf.yaml")
    if err != nil {
        fmt.Println("配置檔案conf.yaml錯誤", err)
        //錯誤處理
        return
    }

    conf := new(Config)
    err = yaml.Unmarshal(yamlFile, conf)
    if err != nil {
        fmt.Println("解碼錯誤: ", err)
        //錯誤處理
        return
    }

    fmt.Println("yaml")
    fmt.Println(conf.Mysql)

    //根據欄位需要選擇配置節
    db, ok := conf.Mysql["default"]
    if ok {
        fmt.Println(db.Host)
        fmt.Println(db.Dbname)
        fmt.Println(db.Username)
        fmt.Println(db.Password)
    } else {
        fmt.Println("error")
        //錯誤處理
        return
    }
    fmt.Println(conf.Mysql["slave_db01"])
    fmt.Println(conf.Mysql["user_center"])
    fmt.Println(conf.Mysql["data_center"])
}

conf.yaml

mysql:
    default: {
        host: 127.0.0.1:3306,
        dbname: test,
        username: root,
        password: default
    }
    slave_db01: {
        host: 127.0.0.1:3306,
        dbname: test,
        username: root,
        password: slave_db01
    }
    user_center: {
        host: 127.0.0.1:3306,
        dbname: test,
        username: root,
        password: user_center
    }
    data_center: {
        host: 127.0.0.1:3306,
        dbname: test,
        username: root,
        password: data_center
    }

conf.json

{
    "mysql": {
        "default": {
            "host": "127.0.0.1:3306",
            "dbname": "test",
            "username": "root",
            "password": "default"
        },
        "slave_db01": {
            "host": "127.0.0.1:3306",
            "dbname": "test",
            "username": "root",
            "password": "slave_db01"
        },
        "user_center": {
            "host": "127.0.0.1:3306",
            "dbname": "test",
            "username": "root",
            "password": "user_center"
        },
        "data_center": {
            "host": "127.0.0.1:3306",
            "dbname": "test",
            "username": "root",
            "password": "data_center"
        }
    }
}

執行結果如下

$ go run main.go
json
map[data_center:{127.0.0.1:3306 test root data_center} default:{127.0.0.1:3306 test root default} slave_db01:{127.0.0.1:3306 test root slave_db01} user_center:{127.0.0.1:3306 test root user_center}]
{127.0.0.1:3306 test root default}
true
127.0.0.1:3306
test
root
default
{127.0.0.1:3306 test root slave_db01}
{127.0.0.1:3306 test root user_center}
{127.0.0.1:3306 test root data_center}
yaml
map[data_center:{127.0.0.1:3306 test root data_center} default:{127.0.0.1:3306 test root default} slave_db01:{127.0.0.1:3306 test root slave_db01} user_center:{127.0.0.1:3306 test root user_center}]
127.0.0.1:3306
test
root
default
{127.0.0.1:3306 test root slave_db01}
{127.0.0.1:3306 test root user_center}
{127.0.0.1:3306 test root data_center}

如果有什麼錯誤的地方或者是更好的方案,希望大家能指出,一起學習進步。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
感謝閱讀,有收穫的話不妨點個贊:smiling_imp:

相關文章