Featured image of post GORMの接続情報をtomlで設定できるようにした

GORMの接続情報をtomlで設定できるようにした

Twitter ツイート Hatena Bookmark ブックマーク

若干Golangの波に乗り遅れた感のあるポリドッグです。
PHPerな僕は他の言語を殆ど触ったことないので、視野を広げるということで、最近Golangを触りはじめたわけです。
しかし、Golangは超初心者の僕にとってはどうやって書いていいのやらさっぱりです。。

そんな僕がGORMの接続をどうするか考えてtomlを使って接続情報を定義してみました。 

GORMとは

ご存知だとは思いますが、とりあえず。

  • GORMはgolangのORマッパーで。
  • マイグレーションの機能や、アソシエーションも出来るので非常に便利。

Tomlファイルを用意する

まずはデータベースの接続用のtomlファイルを作りました。

1
2
3
4
5
6
7
8
[Database]
driver = "mysql"
server = ""
user = "user1"
password = "user1"
database = "testgo"
charset = "utf8"
parseTime = "true"

いたって普通のtomlファイルです。 今回はMySQLに接続する事を想定しています。

Tomlファイルを読み込む

BurntSushi/toml」を使って読み込みます。 ファイル自体はtoml.DecodeFileメソッドで読み込めます。

他にもconfig用の構造体が必要なので、以下の様な形に用意します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
type Config struct {
	Database DbConfig
}

type DbConfig struct {
	Driver    string
	Server    string
	User      string
	Password  string
	Database  string
	Charset   string
	ParseTime string
}

そしてこんな感じでDecodeFileを使って読み込みます。

1
2
3
4
5
var config Config
_, err := toml.DecodeFile("config.toml", &config)
if err != nil {
  panic("unloaded config file")
}

Gormを使ってデータベースへ接続

config周りの実装ができたので、次にデータベースの接続の実装してみました。

1
2
3
connect := fmt.Sprintf("%s:%s@%s/%s?charset=%s&parseTime=%s", config.Database.User, config.Database.Password, config.Database.Server, config.Database.Database, config.Database.Charset, config.Database.ParseTime)

gorm.Open(config.Database.dirver, connect)

これでデータベース自体には接続できます。
しかしこれはダサいですね。

メソッドを利用してもう少しかっこいい形にしましょう。

1
2
3
func (d DbConfig) DSN() string {
	return fmt.Sprintf("%s:%s@%s/%s?charset=%s&parseTime=%s", d.User, d.Password, d.Server, d.Database, d.Charset, d.ParseTime)
}

こんなメソッドを用意すれば綺麗になりますね。

1
gorm.Open(config.Database.dirver, config.Database.DSN())

さらにもう少し洗練させてみましょう。

1
2
3
func (c Config) Db() (string, string) {
	return c.Database.Driver, c.Database.DSN()
}

このようにconfigにメソッド定義することによって、もう少し綺麗になります。

1
gorm.Open(config.Db())

最後に

とりあえずマイグレーションするところまで実装してみました。
うまく構造体とメソッドを使えば、すっきりした実装できそうだなぁーっておもったり。

comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。