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 にはユーザーからは削除できない 統計エンティティ が保存されているため実際に実行すると削除途中でエラーになります。
解決策
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 を起動する必要がありそうです。