2018年1月9日 星期二

AWS DynamoDB SDK v2 基礎使用(三):寫入資料

DynamoDB 不得不說,其實表達的格式相當囉唆~
所以想要存取 DynamoDB,無論如何程式碼都會寫得有點冗長。
而其中因為 Java 又是格式嚴謹的語言,於是又比別的語言再更囉唆一些……。

首先先省略建立資料庫的語法,假設已經從 AWS Console 上建立好一張表格
並且假設表格具備的 Hash Key 是 my_hash_key,型別是 String
Range Key 是 my_range_key,型別是 Number。

DynamoDB 資料型態

DynamoDB 支援的資料型態,可以參考官方文件 [2]。

  • S 字串
  • N 數字
  • B 二進位
  • BOOL 布林
  • SS 字串集合
  • NS 數字集合
  • List 清單

具體來說,所有的資料欄位都會以類似這樣的格式儲存:

{"key_name": {"type": value}}

例如 {“my_key”: {“S”: “my_value”}} 表示的是 key 是 my_key、值是 my_value,而值的型態是字串。

API 基本格式

要寫入資料時,在 SDK 中使用的是 PutItemRequest,而要寫入的資料,必須先被格式化成 Map<String, AttributeValue> 這種型態。

Map<String, AttributeValue> item = new HashMap<String, AttributeValue>();
item.put("my_hash_key", AttributeValue.builder().s("pk").build());
item.put("my_range_key", AttributeValue.builder().n("123").build());

PutItemRequest putItemRequest = PutItemRequest.builder()
	.tableName("my_table")
	.item(item)
	.returnConsumedCapacity(ReturnConsumedCapacity.TOTAL)
	.returnValues(ReturnValue.ALL_OLD)
	.build();

在上面的程式碼中,PutItemRequest 指定了要寫入的資料是 item、資料要寫入到 my_table 這張資料表
並且要求輸出時,要輸出消耗的 Capacity,以及要回傳相同 Primary Key 的舊值。
要求回傳舊值,可以協助判斷這個 PutItem 的指令是否覆蓋了一筆既存的紀錄
如果回覆是一個空的 JSON,表示 PutItem 並沒有找到舊值,因此做了成功的 Insert;
如果回覆的不是空的 JSON,則表示有一個相同 Primary Key 的紀錄被覆蓋了,而這個紀錄的內容就被包含在回覆中。

接著回頭來看看前面建立的 Map<String, AttributeValue>。
這個 Map 是用來表達即將要建立在 DynamoDB 當中的一筆紀錄
實際上 DynamoDB 所有的紀錄都會以這個形式存在,不管是 Put、Update、Query、還是 Scan 的指令都一樣。
其中,Map 的 key 表示的是這個欄位的 key name、value 則表示這個欄位的 value 與其型態。
例如第二行中,my_hash_key 是欄位的 key name,而 value 是 pk,並且被指定為 s 型態,也就是字串型態
而第三行中,my_range_key 是欄位 key name,value 是 123,型態是 n 型態,也就是數字。

參考資料
  1. Writing Data To a Table
  2. AttributeValue

沒有留言: