如何使用Boto获取dynamodb表属性的空值

时间:2019-03-13 12:42:59

标签: python amazon-dynamodb boto3

我正在处理一个像这样的表。 表格名称:沙箱

Id               name                        type

 1                xyz                         
 2                xx                          
 3                xxx                         
 4                yyyy                        private

我面临的问题是。 1)如果属性值为type,则为空。基本上,我想设置一些如果此值为null。但是,dynamodb扫描只是跳过将其放入json响应中。

以下是我编写的python脚本。

dynamodb_resource = session.resource('dynamodb')
table_sandboxes = dynamodb_resource.Table('sandboxes')
response_sandboxes = table_sandboxes.scan()
def _myfun(box_id)
    for i in response_sandboxes['Items']:
                if box_id == i['id']:
                        if i['type'] == 'private':
                                return 'true'
                        else:
                                return 'false'

        return 1


_myfun(2)

我遇到的错误是

KeyError: 'type'

所以, 1)有没有办法我可以扫描并获取属性值,即使它为null? 2)扫描是否是正确的方法? 3)如果桌子的尺寸较大,我是否还需要考虑分页器并进行处理?

对此我是陌生的,将不胜感激。

1 个答案:

答案 0 :(得分:0)

DynamoDB将null视为实际的data type,类似于数字或字符串。在上面的示例中,ID为1、2和3的项中的type属性不是null,只是不存在。在项目ID 4中,其数据类型为字符串。由于DynamoDB是无模式的,因此可以具有具有各种属性的项目(缺失或项目之间不同)。

解决代码错误的最简单方法是在以下项目中测试type

return True if i.get('type') == 'private' else False

您还可以将值作为type类型存储在null属性中(此处的命名方式会造成混淆),但是您不能在该属性中存储值private。我认为那不是你想要的。

关于第二个问题,您怀疑scan并不是最好的方法。 DynamoDB中的数据建模本身就是一个主题。 DynamoDB docs是开始学习它的好方法。如果要通过其type属性来检索项目,则可以做的一件事就是创建一个GSI来完成此操作。