Golangの有名なフレームワークのひとつRevelに用いるORMを探していたときにGorpを見つけたけれど、何となく違うなーと思って他を探していたときに見つけたORMのGorm。
初期設定にハマったので備忘として。
せっかくなのでDBから取得したデータはRevelのCache機能でCacheするようにしてみた。
まずは gorm.go を作成。
package db
import (
"github.com/revel/revel"
"github.com/jinzhu/gorm"
_ "github.com/go-sql-driver/mysql"
"strings"
"fmt"
"time"
)
var Gdb gorm.DB
var GCacheTime time.Duration
var TimeFormat string
func getConnectionString() string {
host := getParamString("db.host", "")
port := getParamString("db.port", "3306")
user := getParamString("db.user", "")
pass := getParamString("db.password", "")
dbname := getParamString("db.name", "")
protocol := getParamString("db.protocol", "tcp")
dbargs := getParamString("db.args", " ")
if strings.Trim(dbargs, " ") != "" {
dbargs = "?" + dbargs
} else {
dbargs = ""
}
return fmt.Sprintf("%s:%s@%s([%s]:%s)/%s%s",
user, pass, protocol, host, port, dbname, dbargs)
}
func InitDB() {
var err error
connectionString := getConnectionString()
Gdb, err = gorm.Open("mysql", connectionString)
if err != nil {
revel.ERROR.Println("FATAL", err)
panic( err )
}
Gdb.LogMode(getParamBool("db.debug"))
GCacheTime = getCacheTime()
TimeFormat = "2006-01-02 15:04:06"
}
func getParamString(param string, defaultValue string) string {
p, found := revel.Config.String(param)
if !found {
if defaultValue == "" {
revel.ERROR.Fatal("Cound not find parameter: " + param)
} else {
return defaultValue
}
}
return p
}
func getParamInt(param string) int {
p, found := revel.Config.Int(param)
if !found {
revel.ERROR.Fatal("Cound not find parameter: " + param)
}
return p
}
func getParamBool(param string) bool {
p, found := revel.Config.Bool(param)
if !found {
revel.ERROR.Fatal("Cound not find parameter: " + param)
}
return p
}
func getCacheTime() time.Duration {
cacheTime := time.Duration(getParamInt("cache.time")) * time.Minute
if cacheTime < 0 {
cacheTime = 1 * time.Nanosecond
}
return cacheTime
}
そしたら 今度は model を作成
package models
import (
d "api.gamefeat.net/app/libs/db"
"github.com/revel/revel/cache"
"github.com/revel/revel"
"errors"
)
func (t TableModel) FindData(id string) (res TableModel, err error){
//DB接続
d.InitDB()
if c := cache.Get("SQL_CACHE_"+id, &res); c != nil {
if d.Gdb.Table("table_name").Select("*").Where("id = ?", id, 0, 0).First(&res).RecordNotFound() {
err = errors.New("FindData - NoData id : "+id)
return res, err
}
go cache.Set("SQL_CACHE_"+id, res, d.GCacheTime)
}
revel.INFO.Println(d.GCacheTime)
revel.INFO.Println(res)
return res, err
}
これでとりあえずGORMを使えるようになるはず。
GORMはなかなか便利で使い勝手がいい感じがした。