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