【学習記録】DB接続情報を環境変数から取得するように設定

個人開発してるアプリでDBと接続する処理を書いてる部分があんまりまとまってなかったので、環境変数からDB接続情報を取得するように修正しました。
コミットは以下になります。

github.com

実装したかった内容は

  • ローカルで開発する時はローカルで起動しているMySQLコンテナと接続する

  • 本番環境にデプロイする時は本番用のDBと接続する(自分の場合はAWS RDS)

の二つをなるべく無駄のないコードの書き方で切り替えれるようにしたい、という感じでした。

そういう状況では環境変数で接続する先を切り替えるのが無難かと思い、以下のようなコードにしました。

// CreateDBConnection 環境変数で指定したDBと接続する
func CreateDBConnection() *gorm.DB {

    // ENVIRONMENTがlocalの場合はローカルのMySQLコンテナと接続する
    if os.Getenv("ENVIRONMENT") == "local" {
        db, err := gorm.Open("mysql", "root:root@tcp(localhost:3306)/test_database?parseTime=true")
        if err != nil {
            fmt.Println("error occured at db connection")
            return nil
        }
        db.LogMode(true)

        return db
    }

    // ENVIRONTMENTがproductionの場合は本番環境のDBと接続する
    if os.Getenv("ENVIRONMENT") == "production" {

        DBMS := os.Getenv("DBMS")
        USER := os.Getenv("USER")
        PASSWORD := os.Getenv("PASSWORD")
        HOST := os.Getenv("HOST")
        DBNAME := os.Getenv("DBNAME")
        CONNECT := USER + ":" + PASSWORD + "@" + HOST + "/" + DBNAME + "?parseTime=true"
        db, err := gorm.Open(DBMS, CONNECT)

        if err != nil {
            fmt.Println("error occured at db connection")
            return nil
        }

        return db
    }

    fmt.Println("環境変数を設定してください")
    return nil
}

環境変数の設定は以下のようにSetenv関数を使っています。

// SetEnvVariables 環境変数を設定
func SetEnvVariables() {
    os.Setenv("DBMS", "xxxx")
    os.Setenv("USER", "xxxxxx")
    os.Setenv("PASSWORD", "xxxxxxxxxx")
    os.Setenv("PROTOCOL", "xxxxxxxxxxx")
    os.Setenv("DBNAME", "xxxxxxxxxxx")
}

.envファイル使ったりECSのタスクで定義で環境変数を設定する方法もあると思いますが、ローカルでSetenv関数を使う方が自分の中で整理しやすかったのでこの方法に落ち着きました。
環境変数の設定方法は後々修正していくかも知れません。

全体的にもっと良いコードの書き方はあるかも知れませんが、少なくとも自分が実現したかった内容にできたのでひとまずOKとします。

今の時点で気づけてない問題が後から出てきたらその都度対応していきます。

むしろそういう問題に出会えたら今よりも一気に学びや発見があるはずなので、完璧かどうかわからなくても今できる最善のコードをデプロイしていくことは意味があると思ってます。
問題が発生する前からなんとなく自信なくてコード書くのをためらってたらあまり成長に繋がらないと考えてるので、どんどんコード書いてなるべく多くの成功と失敗を個人開発で経験できるようにして、現場に活かしていきたいと思います。