問題
cloud.google.com/go/datastore
datastore package - cloud.google.com/go/datastore - pkg.go.dev
を使ってDatastore | Google CloudにデータをPut
していて、掲題のエラーを得た。
ev := models.Event{/* なんらかの値 */} if _, err := tx.Put(key, ev); err != nil { return err }
datastore: invalid entity type
調査
まずエラーメッセージが貧弱なので、定義を知りたい。
Search · datastore: invalid entity type · GitHub
あらためて、順当にPut
を掘っていく。
Put
では、PutMulti
を呼んでいるPutMulti
では、putMutations
を呼んでいるputMutations
では、1つずつsaveEntity
を呼んでいるsaveEntity
では、structに対しSaveStruct
を呼んでいるSaveStruct
では、Saveの前にnewStructPLS
を呼んでいる- PLSとは、PropertyLoadSaverのことで、Load/Saveの操作を担っている
newStructPLS
では、LoadないしSaveする値がポインタであるか見ており、ここでErrInvalidEntityType
を返している
結論
Getのみならず、Put系であっても、Structの値はPointerである必要がある。
ev := models.Event{/* なんらかの値 */} - if _, err := tx.Put(key, ev); err != nil { + if _, err := tx.Put(key, &ev); err != nil { return err }
雑感
- たしかにエラーメッセージとして十分だとは思うが、自作パッケージをつくるなら、もうちょっと丁寧に返したい
- 最近、WETもDRYもぜんぜん書いてなくてさみしい
DRYな備忘録として