繁体   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