LoginSignup
21
19

More than 5 years have passed since last update.

GolangのORマッパー gormを使ってみた

Posted at

課題

golangのデフォルトコネクタdatabase/sqlだと生クエリを叩くことになるので、SQLインジェクション対策をしたいなと思っていたが、SQLインジェクション対策を0から実装するのは面倒なので、ORマッパーのプラグインを導入

gormって?

  • RailsやLaravelっぽいORマッピングを実装してくれる
  • Modelとなるstructに対し、gorm.ModelsというパラメータをつけるだけでID, updated_at, created_at, deleted_at等をつけてくれる
  • リレーションもstructの中に定義しておけば勝手にやってくれる
  • structを元にマイグレーションをやってくれる
  • 使い方はdatabase/sqlに近い

実装方法

コネクション作成周りはdatabase/sqlと同じでいけます

main.go
import (
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)
...
toml.DecodeFile("config.toml", &config)
dbconf := config.Mysql.User + ":" + config.Mysql.Pass + "@tcp(" + config.Mysql.Host+ ":3306)/" + config.Mysql.DB
db, err = gorm.Open("mysql", dbconf)
if err != nil {
    panic(err.Error())
}
defer db.Close() // 関数がリターンする直前に呼び出される

リレーションに関しても

main.go
type User struct {
    gorm.Model
    Api Api `json:"api" gorm:"ForeignKey:UserId"` // Has one
}
type Api struct {
    gorm.Model
    UserId int
    ApiId int `json:"api_id"` // Belongs To
    AccessToken string `json:"access_token"`
    RefreshToken string `json:"refresh_token"`
}

とかしておけば、勝手に解決してくれます。
jsonの受け皿としても使えるので、リクエストのbodyに対して、自動割当も可能です。

main.go
func register(w http.ResponseWriter, r *http.Request) {
    docoder := json.NewDecoder(r.Body)
    var user User
    err := docoder.Decode(&user)
    if err != nil {
        panic(err)
    }
}

更に、マイグレーションに関しても

main.go
    db.AutoMigrate(&User{}, &Api{})

とやるだけ。

21
19
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
21
19