Posted at

gorpでの開発ハマりポイント


Gorp

goのORM?

https://github.com/go-gorp/gorp


I hesitate to call gorp an ORM. Go doesn't really have objects, at least not in the classic Smalltalk/Java sense. There goes the "O". gorp doesn't know anything about the relationships between your structs (at least not yet). So the "R" is questionable too (but I use it in the name because, well, it seemed more clever)


のようにORMとは呼んでほしくないようです。

クエリビルダーや構造体とのマッピングをしてくれるの代物です。


insertに失敗する場合

モデル、DBを定義して取得はできたが、insertができないという場合


Error: No table found for type

dbmapでテーブルとモデルの紐付けができていません。


client.go

dbmap := &gorp.DbMap{Db: db, Dialect: gorp.MySQLDialect{"InnoDB", "UTF8"}}

user := dbmap.AddTableWithName(model.User{}, "users")

2行目でマッピングを行なっています。


構造体とカラムのマッピングが失敗する場合


user.go

 // User ... ユーザーモデル 

type User struct {
ID int64 `db: "id" json:"id"`
name string `db: "profile_name" json:"profile_name"`
CreatedAt time.Time `db: "created_at" json:"created_at"`
}


のようにDBカラムと構造体のマッピングが可能ですが、

created_atのようにアンダースコアが入る場合、


gorp: no fields [created_at] in type User

という例外を吐く場合があります。

これは

dbmap := &gorp.DbMap{Db: db, Dialect: gorp.MySQLDialect{"InnoDB", "UTF8"}}

user := dbmap.AddTableWithName(model.User{}, "users")
user.ColMap("CreatedAt").Rename("created_at")

このように2行目でテーブルの追加(updateやdeleteの際に必要)

3行目でモデル側のフィールド名とDB側のカラム目の紐付けをすればうまくいきます。