UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Cloud Datastore】特定のエンティティを削除する

GCP Datastoreにうっかり間違えたデータを大量に登録してしまった

幸い、今日(2020/03/24 AM10:00)以降に登録したデータを全て削除すればよいので、GUIからフィルタリングしてチェックボックス全てを選択して削除すればよいかと思ったが、一覧には最大50までしかエンティティが表示されず、何ページあるのかもわからないので絶望的だった

f:id:uggds:20200324230825p:plain

そこで、以下のドキュメントを読んで、Cloud Dataflow を用いて削除を行うことにした
一括削除と聞いて全件削除と勘違いしていたが、GQLで検索した結果だけを削除することができる

cloud.google.com

エンティティを一括で削除する必要がある場合は、データ処理ワークフローを開発、実行するためのマネージド サービスである Cloud Dataflow を使用することをおすすめします。Cloud Dataflow では、Cloud Datastore の削除テンプレートを使用して、GQL クエリで選択されたエンティティを削除できます。

だが、そもそもGQLクエリでどうやって日付でフィルタリングするんだというところから始まった

日付でフィルタリングしたGQLクエリ

この辺を読んで、DATETIME(<string>)を使えばよいことがわかった

GQL Reference  |  Cloud Datastore Documentation  |  Google Cloud

実際のクエリ

SELECT * FROM <kind name> WHERE created > DATETIME('2020-03-24T10:00:00.00000+09:00')

Cloud Dataflowを使ったエンティティの一括削除

上のドキュメントを読んでCloud Dataflowを開始した上で、以下の設定を行った

  • ジョブ名
    delete-entity
  • リージョンエンドポイント
    Datastoreと同じリージョンを選択
  • Cloud Dataflow テンプレート
    「Cloud Dataflowのエンティティの一括削除」を選択
  • GQLクエリ
    上記に書いたGQLクエリ
  • 読み取りたいデータストアプロジェクトID
    DatastoreがあるプロジェクトID
  • 削除したいデータストアプロジェクトID
    DatastoreがあるプロジェクトID
  • 一時的なローケーション
    GCSのtmpディレクトgs://<project-id>.appspot.com/tmp

f:id:uggds:20200324234133p:plain

設定が終わったらジョブを実行ボタンを押す

しばらくして完了するとこんな感じにジョブ情報と一緒に表示される

f:id:uggds:20200324234659p:plain

CLIからもできるみたいなので、それは今度試してみる

参考

GCP DatastoreのKindを一括削除する - APC 技術ブログ