亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從迪納摩DB的戈朗 SDK 中序列化“最后評估密鑰”?

如何從迪納摩DB的戈朗 SDK 中序列化“最后評估密鑰”?

Go
心有法竹 2022-09-12 20:11:49
在 Golang 中使用 DynamoDB 時,如果呼叫有更多結果,則會設置 在 上,然后您可以將其傳遞到下一個呼叫,以便從上次中斷的地方繼續。queryLastEvaluatedKeyQueryOutputqueryExclusiveStartKey當價值觀留在戈朗時,這很有效。但是,我正在編寫分頁 API 終結點,因此我想序列化此密鑰,以便可以將其作為分頁令牌交還給客戶端。像這樣,哪里是神奇的包,它可以做我想做的事:somethingtype GetDomainObjectsResponse struct {  Items     []MyDomainObject `json:"items"`  NextToken string           `json:"next_token"`}  func GetDomainObjects(w http.ResponseWriter, req *http.Request) {  // ... parse query params, set up dynamoIn ...  dynamoIn.ExclusiveStartKey = something.Decode(params.NextToken)  dynamoOut, _ := db.Query(dynamoIn)  response := GetDomainObjectsResponse{}  dynamodbattribute.UnmarshalListOfMaps(dynamoOut.Items, &response.Items)  response.NextToken := something.Encode(dynamoOut.LastEvaluatedKey)    // ... marshal and write the response ...}(請原諒上面的任何拼寫錯誤,這是我快速編寫的代碼的玩具版本,以隔離問題)由于我需要支持具有不同搜索模式的多個終結點,因此我希望找到一種生成不依賴于特定搜索關鍵字的分頁標記的方法。麻煩的是,我還沒有找到一種干凈而通用的方法來序列化.您可以將其直接封送到JSON(然后例如base64編碼以獲取令牌),但這樣做是不可逆的。 是一個 ,并且是一個接口,因此雖然 json 編碼器可以讀取它,但它無法寫入它。LastEvaluatedKeyLastEvaluatedKeymap[string]types.AttributeValuetypes.AttributeValue例如,以下代碼使用 崩潰。panic: json: cannot unmarshal object into Go value of type types.AttributeValuelastEvaluatedKey := map[string]types.AttributeValue{    "year":  &types.AttributeValueMemberN{Value: "1993"},    "title": &types.AttributeValueMemberS{Value: "Benny & Joon"},}bytes, err := json.Marshal(lastEvaluatedKey)if err != nil {  panic(err)}decoded := map[string]types.AttributeValue{}err = json.Unmarshal(bytes, &decoded)if err != nil {  panic(err)}我想要的是一種直接使用迪納莫DB風格的JSON的方法,就像你在CLI上運行aws動態模型查詢時得到的一樣。不幸的是,高浪 SDK 不支持此功能。我想我可以為 AttributeValue 類型編寫自己的序列化程序/反序列化程序,但這比這個項目應該付出的努力還要多。有沒有人找到一種通用的方法來做到這一點?
查看完整描述

1 回答

?
鳳凰求蠱

TA貢獻1825條經驗 獲得超4個贊

好吧,我想通了一些東西。


type GetDomainObjectsResponse struct {

  Items     []MyDomainObject `json:"items"`

  NextToken string           `json:"next_token"`

}

  

func GetDomainObjects(w http.ResponseWriter, req *http.Request) {

  // ... parse query params, set up dynamoIn ...


  eskMap := map[string]string{}

  json.Unmarshal(params.NextToken, &eskMap)

  esk, _ = dynamodbattribute.MarshalMap(eskMap)

  dynamoIn.ExclusiveStartKey = esk


  dynamoOut, _ := db.Query(dynamoIn)


  response := GetDomainObjectsResponse{}

  dynamodbattribute.UnmarshalListOfMaps(dynamoOut.Items, &response.Items)


  lek := map[string]string{}

  dynamodbattribute.UnmarshalMap(dynamoOut.LastEvaluatedKey, &lek)

  response.NextToken := json.Marshal(lek)

  

  // ... marshal and write the response ...

}


(再次這是我真正的解決方案匆忙轉回玩具問題,所以請原諒任何拼寫錯誤)


正如@buraksurdar指出的那樣,采取.事實證明,除了具體類型之外,您還可以傳入 ,它就可以正常工作。attributevalue.Unmarshalinteface{}map[string]string


我相信如果這不是平坦的,這將不起作用,所以這不是一個通用的解決方案[需要引用]。但我的理解是,從調用返回的總是平坦的,所以它適用于這個用例。AttributeValueLastEvaluatedKeyQuery


查看完整回答
反對 回復 2022-09-12
  • 1 回答
  • 0 關注
  • 80 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號