在 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 不支持这一点,是否有比为它实现代码更好的选择?
原文由 manelmc 发布,翻译遵循 CC BY-SA 4.0 许可协议
为了理解如何解决这个问题,重要的是要认识到 boto3 有两种基本操作模式:一种使用低级 Client API,另一种使用高级抽象,如 Table 。问题中显示的数据结构是低级 API 使用/生成的示例,AWS CLI 和 dynamodb Web 服务也使用它。
回答你的问题 - 如果你可以在使用 boto3 时专门使用像 Table 这样的高级抽象,那么事情对你来说会容易一些,正如评论所建议的那样。然后你可以回避整个问题 - python 类型为你编组到低级数据格式和从低级数据格式编组。
但是,有时无法单独使用这些高级构造。在处理附加到 Lambda 的 DynamoDB 流时,我特别遇到了这个问题。 lambda 的输入始终采用低级格式,这种格式更难与 IMO 一起使用。
经过一些挖掘,我发现 boto3 本身有一些漂亮的功能隐藏起来进行转换。这些功能在前面提到的所有内部转换中都隐式使用。要直接使用它们,请导入 TypeDeserializer/TypeSerializer 类并将它们与 dict comprehensions 结合起来,如下所示: