みつろぐ

やれることはやってみる

Golangで複数DBの設定を管理する方法を考えてみる

最近Golangを勉強中です。

Golangなアプリケーションで、複数のDBへ接続する機会があるかどうかはさておき、調べても良い方法が見つからなかったので書いてみた。

今回は設定ファイルの管理に BurntSushi/toml を使ったが、go-yaml/yaml でもよさそう。 ちなみに設定ファイルは以下のような形式を想定してる。

[hoge.master]
database = "hoge"
user = "root"
password = "root"
host = "127.0.0.1"
port = 3306

[hoge.slave.0]
database = "hoge"
user = "root"
password = "root"
host = "127.0.0.1"
port = 3306

[hoge.slave.1]
database = "hoge"
user = "root"
password = "root"
host = "127.0.0.1"
port = 3306

実際に設定を読み込むコードがコチラ

package config

import (
    "log"
    "os"
    "strings"

    "github.com/BurntSushi/toml"
)

type Database struct {
    Name     string
    User     string
    Password string
    Host     string
    Port     int
}

var databaseConfigs = loadDatabaseConfigs()

func loadDatabaseConfigs() interface{} {
    var fpath = "resource/config/database.tml"
    var configs interface{}
    if _, err := toml.DecodeFile(fpath, &configs); err != nil {
        log.Fatalln("[ERROR] : failed to read '" + fpath + "'")
    }
    return configs
}

func GetDatabase(args ...string) Database {
    var config = databaseConfigs
    for _, arg := range args {
        config = config.(map[string]interface{})[arg]
    }
    c := config.(map[string]interface{})
    return Database{c["database"].(string), c["user"].(string), c["password"].(string), c["host"].(string), int(c["port"].(int64))}
}

BurntSushi/toml のサンプルコードではパースした結果の構造体が定義されているサンプルがあるが、interfaceを活用してパースの結果を受け取ることもできる。 結果的に、GetDatabase("hoge", "master")とかGetDatabase("hoge", "slave", "0")とかすれば、簡単にDBの情報が取得できるようになった。

設定ファイルの読み込み先などを環境変数によって制御するようすれば、local環境やprod環境での切り替えもできると思う。