概要
DynamoDBをAPIで使えるようにした。
次にAPIを通じてCRUD操作する方法を記録しておく。
基本的に公式ガイドを参照したけどわかりにくかったので他も色々見ながら試行錯誤した。
検索するといろんな情報(古い書き方、非推奨の書き方や別の言語での書き方)が入り混じっていて結構わかりにくかった。
create レコードを新規作成
payload.TableNameで指定したテーブルにpayload.Item内のJSONを新規登録する。
テーブル作成時にプライマリーキーに設定した属性は必須。
それ以外はJSONであれば自由。
また、プライマリーキーの値がすでにあるものであった場合はレコードそのものを上書きする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "operation":"create", "payload":{ "TableName":"test", "Item":{ "id":"test", "name":"testName", "type":{ "id":"create", "function":"createFunction" } } } } |
read レコード1件取得
payload.TableNameで指定したテーブルにpayload.Keyにプライマリーキーを指定して1レコードを取得する。
1 2 3 4 5 6 7 8 9 |
{ "operation":"read", "payload":{ "TableName":"test", "Key":{ "id":"test" } } } |
1 2 3 4 5 6 7 8 9 10 |
{ "Item": { "name": "testName", "id": "test", "type": { "id": "create", "function": "createFunction" } } } |
update レコード1件更新
createで同一プライマリキーを指定したときとは違って、レコードの一部を変更できる。
payload.Keyで指定したレコードの更新を行う。
プライマリキー属性は更新できないので、その場合はdeleteしてcreateしなおす必要がある。
また、AttributeUpdatesで処理を定義することもできるが現在は非推奨とされている。
まずUpdateExpressionに式を記入する。
以下の4つの式が使えるがSET, REMOVEの他は基本使わない。
- SET – 属性の追加、更新
- REMOVE – 1 つ以上の属性を項目から削除
- ADD – 数値とセットデータのみサポートするが、通常はADD ではなく SET が推奨される
- DELETE – セットデータ(HashSet)からString配列で指定したものを削除
次にExpressionAttributeNamesに属性名を定義。直接UpdateExpressionで指定してもいいが予約語とかぶらないように注意する。
同様にExpressionAttributeValuesに代入する値を定義。
ReturnValuesは以下から選ぶ。
- ALL_OLD – 更新の発生前に表示されたように、項目全体が返される。
- ALL_NEW – 更新後に表示されるように、項目全体が返される。
- UPDATED_OLD – 更新の発生前に表示されたように、更新した値のみが返される。
- UPDATED_NEW – 更新後に表示されるように、更新した値のみが返される。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
{ "operation":"update", "payload":{ "TableName":"test", "Key":{ "id":"test" }, "UpdateExpression": "SET #tree1.#tree2 = :a", "ExpressionAttributeNames": { "#tree1": "type4", "#tree2": "a1" }, "ExpressionAttributeValues":{ ":a":"updated" }, "ReturnValues":"UPDATED_NEW" } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "operation":"update", "payload":{ "TableName":"test", "Key":{ "id":"test" }, "UpdateExpression": "REMOVE #type", "ExpressionAttributeNames": { "#type": "type2" }, "ReturnValues":"UPDATED_NEW" } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "operation":"update", "payload":{ "TableName":"test", "Key":{ "id":"test" }, "UpdateExpression": "ADD #tree :a", "ExpressionAttributeNames": { "#tree": "num" }, "ExpressionAttributeValues":{ ":a":5 }, "ReturnValues":"UPDATED_NEW" } } |
DELETEは今回の例だと使えないため割愛。
書き方 : DELETE HashSet [“a”,”b”,…]
delete レコード1件削除
プライマリキーを指定してレコードを削除する。
1 2 3 4 5 6 7 8 9 |
{ "operation":"delete", "payload":{ "TableName":"test", "Key":{ "id":"test" } } } |
list レコード一覧取得
テーブルを指定してレコード一覧を取得する。
1 2 3 4 5 6 |
{ "operation":"list", "payload":{ "TableName":"test" } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "Items": [ { "name": "firstName", "id": "firstRecoed" }, { "name": "secondName", "id": "secondRecoed" } ], "Count": 2, "ScannedCount": 2 } |