GoのORマッパーGORMが便利

golangではmysqldriverでmysqlにアクセスできますが、
一つ一つ構造体に入れないといけなかったりと、けっこう辛いものがあります。
goでmysqlを使う

そこでいろいろ探していたところ、
ActiveRecordのように構造体を使ってDBにアクセスできるORMがありました。
https://github.com/jinzhu/gorm

自動でテーブル作ってくれたり、変更してくれたりと、他のORマッパーよりかはActiveRecordっぽいです。
リレーションも勝手に貼ってくれるみたいです。
ただし、取り出すときは元のオブジェクト→リレーションのオブジェクトと、
順に取ってくる必要があり、自動でリレーション先のオブジェクトの取得はしてくれるわけではありません。
(使わない場合は無駄なアクセスになるので、正しいと言えば正しいですが)

package main

import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/lib/pq"
_ "github.com/go-sql-driver/mysql"
)

type User struct {
  Id           int64
  Name         string  `sql:"size:255"`
  Emails            []Email         // One-To-Many relationship (has many)
}

type Email struct {
  Id         int64
  UserId     int64   // Foreign key for User (belongs to)
  Email      string  `sql:"type:varchar(100);"` // Set field's type
}

func main(){
  db, err := gorm.Open("mysql", "root@/testdb?charset=utf8&parseTime=True")
  fmt.Println(err)

  db.DB()
  db.AutoMigrate(&Email{})
  db.AutoMigrate(&User{})

  user := User{
    Name:            "ota42y",
    Emails:          []Email{ {Email: "[email protected]"}, {Email: "ota42y@[email protected]"} },
  }
  db.Create(&user)

  var me User
  db.Where("name = ?", "ota42y").First(&me)
  fmt.Println(me)

  var emails []Email
  db.Model(&me).Related(&emails)
  fmt.Println(emails)
}