GoとGORMを使った勉強(3)

#概要
・[GoとGORMを使った勉強(2)](https://qiita.com/yamauchikei/items/cb739cc86d8b0a5d851e)の続き　※さらに[続き](https://qiita.com/yamauchikei/items/a783d6609256c93dc13c)あります
・前回まで：ローカル環境でDBに接続してテーブルの情報を画面に表示
　今回　　：レンタルサーバーで画面表示するための準備

#今回すること
・「.envファイル」に接続情報を書き込む
・「controller.go」を書き換える
・main.goをbuildする

#.envファイルを作成し接続情報を書き込む
main.go

````:root/.env
DB_USER=fuga
DB_PASS=fugapass
DB_HOST=127.0.0.1
DB_NAME=hoge
````

#controller.goのDBとの接続する処理の部分を書き換える
「.envファイル」から接続情報を読み込むように「controller.go」を書き換える。
最終的にはサーバー上にサーバー用の「.envファイル」を置いておくことで、コードを書き換えることなく、サーバーとローカル両方で動作するようになる。


````golang:controller/controller.go
package controller

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

func DB() *gorm.DB {
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 変更前 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
	dsn := "fuga:fugapass@tcp(127.0.0.1:3306)/hoge?charset=utf8mb4&parseTime=True&loc=Local"
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 変更後 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
    dbUser := os.Getenv("DB_USER")
    dbPass := os.Getenv("DB_PASS")
    dbHost := os.Getenv("DB_HOST")
    dbName := os.Getenv("DB_NAME")
    dsn := fmt.Sprintf("%s:%s@tcp(%s:3306)/%s?charset=utf8mb4&parseTime=True&loc=Local", dbUser, dbPass, dbHost, dbName)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("failed to connect database")
	}
	return db
}
````

````golang:controller/controller.go
package controller

import (
	"fmt"
	"os"

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

func DB() *gorm.DB {
	dbUser := os.Getenv("DB_USER")
	dbPass := os.Getenv("DB_PASS")
	dbHost := os.Getenv("DB_HOST")
	dbName := os.Getenv("DB_NAME")
	dsn := fmt.Sprintf("%s:%s@tcp(%s:3306)/%s?charset=utf8mb4&parseTime=True&loc=Local", dbUser, dbPass, dbHost, dbName)
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

	if err != nil {
		panic("failed to connect database")
	}
	return db
}

````

````golang:main.go
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 省略 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
func main() {
	file, _ := os.OpenFile("app.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
	defer file.Close()
	gin.DefaultWriter = io.MultiWriter(file)

	r := gin.Default()

	r.GET("/users", controller.ListUsers)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 変更前 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
	r.Run(":80")
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 変更後 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
	if os.Getenv("GIN_MODE") == "release" {
		cgi.Serve(r)
	} else {
		r.Run(":80")
	}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
}
````

#main.goをbuildする
maingoをbuildすることでバイナリファイルが作られます。このファイルを使いたい環境によってオプションを変更する必要があるため環境を調べます。
ファイルを使いたい環境でgo envを実行することで情報が取得できます。
私の場合は、さくらのレンタルサーバーを使っているのでサーバーに接続して`go env`して
「GOOS=freebsd」,「GOARCH=amd64」を確認しました


````
GOOS=freebsd GOARCH=amd64 go build -a -tags netgo -installsuffix netgo --ldflags '-extldflags "-static"' -o index.cgi main.go
````

###`go buildオプション`
>
`-a`すでに最新であるパッケージを全て更新します。
`-tags netgo -installsuffix netgo `デフォルトのインストールパッケージと区別するため、このサフィックスを利用して依存するパッケージをインストールします。
`-o index.cgi main.go` 出力するファイル名を指定します。今回はindex.cgiに設定しています。
※そのほかのオプションについてはよくわからず使っているので後日追記します

＜参考記事＞
https://qiita.com/Utr/items/9469c1611abe8a0a3486
https://astaxie.gitbooks.io/build-web-application-with-golang/content/ja/01.3.html


##次回、レンタルサーバーにファイルを送ります