LoginSignup
3
1

More than 3 years have passed since last update.

Dataflow を使用して Datastore にある複数 Kind のエンティティを一括削除する

Last updated at Posted at 2021-02-09

Dataflow を使用して Datastore のエンティティを一括削除する際の GQL クエリについて紹介します。

この手順自体は 公式ドキュメント に掲載されており、 Qiita にも 記事 があります。
しかし削除対象の Kind が多数ある場合は少し工夫が必要になります。

何が問題か?

特定の Kind のみ削除する場合は次のような GQL クエリを指定します。

SELECT __key__ FROM myKind

https://cloud.google.com/datastore/docs/reference/gql_reference より引用

SELECT __key__ はキーのみを参照する指定です。
これは SELECT * より速く Small operations になるのでコスト面で有利になります。

FROM myKind は対象となる Kind の指定です。
この指定を行わない場合はすべての Kind が対象になります。

普通に考えると SELECT __key__ を指定すれば一括削除できそうですが Datastore にはユーザーからは削除できない 統計エンティティ が保存されているため実際に実行すると削除途中でエラーになります。

参考: https://stackoverflow.com/questions/49641088/is-it-possible-to-delete-all-google-cloud-datastore-kinds-within-a-namespace

解決策

GQL クエリでキーを比較して統計エンティティを除外します。
キーの比較はバイト値順 であるため Kind が大文字で始まっている場合は次のクエリを使用します。

SELECT __key__ WHERE __key__ < KEY(__, ' ')

Kind が小文字で始まっている場合は次のようなクエリになります。
(こちらのクエリは試していないため失敗する可能性があります)

SELECT __key__ WHERE __key__ >= KEY(a, '\0')

gcloud から実行する場合の注意点

gcloud から削除処理を実行する場合はクエリで , を使用しているため parameters の区切り文字を変更する必要があります。

参考: https://cloud.google.com/sdk/gcloud/reference/topic/escaping?hl=ja

ネームスペース

削除対象のネームスペースを指定しない場合はすべてのネームスペースが削除対象になるという記事を見かけたのですが実際にはデフォルトネームスペースが削除対象になるようでした。

何か見落としがあるかもしれませんが削除対象のネームスペースが多数ある場合は個別に Dataflow を起動する必要がありそうです。

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