LoginSignup
3
1

More than 5 years have passed since last update.

Datastoreに map[string]interface{} を保存/取得する

Posted at

このページは?

map[string]interface{}のデータをDatastoreに保存/取得したくなったので、その方法をメモとして残しておきます。

Datastoreにmap型を保存する

Golangで、Datastoreに保存できるプロパティの型は以下にまとまっています。
https://cloud.google.com/appengine/docs/standard/go/datastore/entities

map型を直接、Cloud Datastore保存させることはできません!
[]byte型に変換することで、保存することができます。

⚠️注意点⚠️

[]byte型は1MBまでしか保存することができません。
またインデックスさせることもできません。

Value type Go type(s) Sort order Notes
Byte slice (long) []byte None Up to 1 megabyte
Not indexed

type User struct {
    ID           string
    Claims       map[string]interface{} `datastore:"-"`
    ClaimsBinary []byte
    Name         string `datastore:"-"`
}

PropertyLoadSaver

PropertyLoadSaverを活用することで、読み込み時にmapの値を取得したり、保存時にmap[]byteに変換することができます。

func (u *User) Load(ps []datastore.Property) error {
    if err := load(u, ps); err != nil {
        return err
    }

    if err := json.Unmarshal(u.ClaimsBinary, &u.Claims); err != nil {
        return err
    }

    u.Name = u.Claims["name"].(string)

    return nil
}

func (u *User) Save() ([]datastore.Property, error) {
    binary, err := json.Marshal(u.Claims)
    if err != nil {
        return nil, err
    }

    u.ClaimsBinary = binary

    return save(u)
}

参考
- https://github.com/GoogleCloudPlatform/google-cloud-go/issues/223

3
1
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
3
1