python - 如何将 boto3 Dynamo DB 项目转换为 Python 中的常规字典?

标签 python amazon-web-services dictionary amazon-dynamodb boto3

在 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 有两种基本操作模式:一种使用低级 Client API,以及使用更高级别抽象的 API,如 Table .问题中显示的数据结构是低级 API 使用/生成的示例,AWS CLI 和 dynamodb Web 服务也使用它。

回答您的问题 - 如果您在使用 boto3 时可以专门使用 Table 等高级抽象,那么正如评论所建议的那样,事情对您来说会容易得多。然后您可以回避整个问题 - python 类型为您编码到低级数据格式和从低级数据格式编码。

但是,有时无法单独使用这些高级构造。在处理附加到 Lambda 的 DynamoDB 流时,我特别遇到了这个问题。 lambda 的输入始终采用低级格式,这种格式更难与 IMO 一起使用。

经过一些挖掘,我发现 boto3 本身有一些隐藏的漂亮功能用于进行转换。这些功能在前面提到的所有内部转换中都隐式使用。要直接使用它们,请导入 TypeDeserializer/TypeSerializer 类并将它们与 dict comprehensions 结合起来,如下所示:

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

关于python - 如何将 boto3 Dynamo DB 项目转换为 Python 中的常规字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43755888/

相关文章:

python - 从列表创建元组列表

python - 抓取网站时回发或回调参数无效

Python - 根据列表字典中的出现对列表中的项目进行分类

python - 如何在 Windows 中用 python 处理文件上传?

python - 如何确定一个单词是否按字母顺序在 Python 中拼写

amazon-web-services - Cloudfront 中可能的 X-Cache 值

amazon-web-services - Cloudwatch中 "Avg Replica Lag"指标的机制是什么?

python - 从 Amazon S3 上的子文件夹获取上次修改的文件路径。 Python

c++ - 二叉树类创建随机节点,打破

python - 在字典中的列表中以某种方式复制值