LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-10-13

概要

GoとGORMを使った勉強(2)の続き ※さらに続きあります
・前回まで:ローカル環境で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ファイル」を置いておくことで、コードを書き換えることなく、サーバーとローカル両方で動作するようになる。

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
}
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
}

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0