Top View


Author watanabe

DynamoDBでのハッシュキーに関連づくデータの一括削除処理

2019/02/16

削除は1個ずつしかできない

delete-itemでハッシュ(パーティション)キーをしていすれば、範囲(ソート)キーを指定せずともハッシュキーに関連付く全データを削除できないかと人(私)は考えるわけですが、そんなことはなかったです。

For the primary key, you must provide all of the attributes. For example, with a simple primary key, you only need to provide a value for the partition key. For a composite primary key, you must provide values for both the partition key and the sort key.

とちゃんと書いてあって、ハッシュキーと範囲キーを指定して一意なレコードを削除することしかできないみたいです。
さて、当初のハッシュキー指定すれば範囲キーなしで全データを削除したいということができないことが発覚しました。

batch-write-itemでがんばる

幸いバッチ処理的なことは batch-write-item でできるようなので、それを使うことにしました。
ただ、これはバッチ書き込みの処理ができるだけであって、処理はちゃんとバッチを投げる側が定義してあげないといけません。
そして、書き込みでできる操作が実は複数あって、削除と書き換えができまして、最初バッチで削除ができないかと思って探したら困りました。

バッチに投げるデータを作る

queryなどで、 hash_key = :val 的なリクエストを投げてデータ一覧を取得します。
そして、そのレコードリストにmapをかけて、

{
  DeleteRequest: {
    Key: { hash_key: $val, range_key: record.range_key }
  }
}

的なデータのリストを作ります。

データをバッチに投げる

そして、

{
  テーブル名: ↑で作った配列
}

のようなデータを request-items に投げます。
テーブル名を指定できるので、テーブルをまたぐデータ操作をできるようです。
別テーブルにメタデータがあるような構成の場合は一緒に削除できるのが嬉しそうです。

問題点とか

と、まあ、こんな感じで一括削除できるんですが、 query を投げたあとにデータを追加された場合を考えるとちょっと憂鬱です。
DynamoDBはRDBじゃないので、そうゆうのを期待してはいけない気がするんですが、大変ですね…。

watanabe

watanabe

技術開発部門所属 一番好きな言語はC++です。