GMOアドマーケティングのy.yです。
今回はGo言語でCloud DatastoreのEntityを特定の条件で一括削除する方法について書きたいと思います。
The Go Blog by CC BY 3.0
単純なEntityの一括削除を行う場合にはCloud Datafllowを使用するのが良さそうです。
Cloud Datastore APIでCommitオペレーションに渡せるエンティティの最大数 は500となっています。
なのでAPIへ一度のリクエストで書込、更新、削除できる最大数は500件までとなります。
そのため、ある特定の条件に当てはまるEntityを全て削除する場合は下記の内容で行えます。
例)更新日が30日以上経過しているentityを削除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
package datastore import ( "context" "time" "cloud.google.com/go/datastore" ) type Task struct { Id string `datastore:"id"` Updated time.Time `datastore:"updated"` } func DeleteEntity(ctx context.Context) error { // 1 kind := "kind" projectID := "project" // 2 client, err := datastore.NewClient(ctx, projectID) if err != nil { return err } //3 t := time.Now() t = t.AddDate(0, 0, -30) for { // 4 var tasks []*Task query := datastore.NewQuery(kind).Filter("updated <", t).Order("updated").Limit(500) keys, err := client.GetAll(ctx, query, &tasks) if err != nil { return err } //5 if keys == nil { break } // 6 if err := client.DeleteMulti(ctx, keys); err != nil { return err } } return nil } |
処理内容としては下記の内容となります。
- DatastoreのKind, Projectを設定
- Clientの作成
- 現在から30日前の日付を取得
- Datastoreから30日以上経過しているEntityを500件取得
- 4のクエリでkeyが取得できているか確認
- 取得したkeyからEntityの削除を実行
4からの処理で500件ずつEntityを取得しkeyが取れなくなるまで削除を繰り返すという処理になります。
まとめ
500件ずつではありますが、cron等を使用すれば特定条件の定期削除は簡単に行えるのかなと思いました。