【Go】DB設定をyamlファイルに外出しする

2025/02/16に公開

GoのプロジェクトでDB設定をyamlなどgit管理外のファイルに記述する方法のメモ書き。

ディレクトリ構成

プロジェクトルート/
└ database/
    ├ database.go
    ├ db_config.go
    └ database.yml

実際のコード

DB設定を読み込むやつ

database/db_config.go
package database

import (
	"os"

	"github.com/go-yaml/yaml"
)

type DBConfig struct {
	Protocol string `yaml:"protocol"`
	Host 		 string `yaml:"host"`
	Port 		 string `yaml:"port"`
	Name 		 string `yaml:"name"`
	User 		 string `yaml:"user"`
	Password string `yaml:"password"`
	Charset  string `yaml:"charset"`
}

func config() (c *DBConfig) {
	b, err := os.ReadFile("database/database.yml")
	if err != nil {
		panic(err)
	}

	yaml.Unmarshal(b, &c)
	return
}

DBに接続する

database/database.go
package database

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

var db *gorm.DB

func Init() {
	c := config()
	db = open(c)
}

func Get() *gorm.DB {
	return db
}

func Close() {
	d, _ := db.DB()
	d.Close()
}

func open(c *DBConfig) *gorm.DB {
	eu := c.User + ":" + c.Password + "@" + c.Protocol + "(" + c.Host + ":" + c.Port + ")/" + c.Name + "?charset=" + c.Charset + "&parseTime=True&loc=Local"
	d, err := gorm.Open(mysql.Open(eu), &gorm.Config{})
	if err != nil {
		panic(err)
	}
	return d
}

yamlにDB情報を記述する

中身は適宜書き換える。

database/database.yml
protocol: tcp
host: localhost
port: 3306
name: sample
user: root
password: pass
charset: utf8mb4

使い方

サーバ起動時にdatabase.Init()、アクセス時にdatabase.Get()する

package main

import (
    "sample/database"
)

func main() {
	database.Init()

    ...
}
package hoge

import (
    "sample/database"
)

func Sample() {
	db := database.Get()
    // db.Where(...)
    ...
}

Discussion