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 型態,也就是數字。
沒有留言:
張貼留言