簡體   English   中英

如何將 boto3 Dynamo DB 項目轉換為 Python 中的常規字典?

[英]How to convert a boto3 Dynamo DB item to a regular dictionary in Python?

在 Python 中,當使用 boto3 從 Dynamo DB 檢索項目時,將獲得如下所示的架構。

{
  "ACTIVE": {
    "BOOL": true
  },
  "CRC": {
    "N": "-1600155180"
  },
  "ID": {
    "S": "bewfv43843b"
  },
  "params": {
    "M": {
      "customer": {
        "S": "TEST"
      },
      "index": {
        "N": "1"
      }
    }
  },
  "THIS_STATUS": {
    "N": "10"
  },
  "TYPE": {
    "N": "22"
  }
}

此外,在插入或掃描時,字典必須以這種方式轉換。 我一直沒能找到一個包裝器來處理這種轉換。 由於顯然 boto3 不支持這一點,是否有比為它實現代碼更好的選擇?

為了理解如何解決這個問題,重要的是要認識到boto3有兩種基本操作模式:一種使用低級客戶端 API,另一種使用更高級別的抽象,如Table 問題中顯示的數據結構是低級API消耗/生成的內容的示例,AWS CLI和dynamodb Web服務也使用該API。

要回答你的問題 - 如果你在使用boto3時可以專門使用像Table這樣的高級抽象,那么對你來說事情會更容易,正如評論所暗示的那樣。 然后你可以回避整個問題 - python類型與你的低級數據格式進行封送處理。

但是,有時候不可能只使用那些高級構造。 在處理附加到Lambdas的DynamoDB流時,我特意遇到了這個問題。 lambda的輸入始終采用低級格式,並且該格式更難與IMO一起使用。

經過一番挖掘后,我發現boto3本身有一些漂亮的功能隱藏起來進行轉換。 這些功能在前面提到的所有內部轉換中隱式使用。 要直接使用它們,請導入TypeDeserializer / TypeSerializer類並將它們與dict理解結合起來,如下所示:

import boto3

low_level_data = {
  "ACTIVE": {
    "BOOL": True
  },
  "CRC": {
    "N": "-1600155180"
  },
  "ID": {
    "S": "bewfv43843b"
  },
  "params": {
    "M": {
      "customer": {
        "S": "TEST"
      },
      "index": {
        "N": "1"
      }
    }
  },
  "THIS_STATUS": {
    "N": "10"
  },
  "TYPE": {
    "N": "22"
  }
}

# Lazy-eval the dynamodb attribute (boto3 is dynamic!)
boto3.resource('dynamodb')

# To go from low-level format to python
deserializer = boto3.dynamodb.types.TypeDeserializer()
python_data = {k: deserializer.deserialize(v) for k,v in low_level_data.items()}

# To go from python to low-level format
serializer = boto3.dynamodb.types.TypeSerializer()
low_level_copy = {k: serializer.serialize(v) for k,v in python_data.items()}

assert low_level_data == low_level_copy

您可以使用 TypeDeserializer class

from boto3.dynamodb.types import TypeDeserializer
deserializer = TypeDeserializer()

document = { "ACTIVE": { "BOOL": True }, "CRC": { "N": "-1600155180" }, "ID": { "S": "bewfv43843b" }, "params": { "M": { "customer": { "S": "TEST" }, "index": { "N": "1" } } }, "THIS_STATUS": { "N": "10" }, "TYPE": { "N": "22" } }
deserialized_document = {k: deserializer.deserialize(v) for k, v in document.items()}
print(deserialized_document)

有一個名為“dynamodb-json”的 python package 可以幫助您實現這一點。 dynamodb-json 實用程序的工作方式與 json 加載和轉儲功能相同。 我更喜歡使用它,因為它本身負責轉換 Decimal 對象。

您可以通過以下鏈接找到示例以及如何安裝它 - https://pypi.org/project/dynamodb-json/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM