【问题标题】:Boto3 - How to filter out attributeType from scan() output using Python Boto3?Boto3 - 如何使用 Python Boto3 从 scan() 输出中过滤出属性类型?
【发布时间】:2020-04-03 23:25:51
【问题描述】:

我正在使用 Boto3 从一个小型 dynamoDB 表中检索和返回所有数据。我的目标是从输出中删除属性类型。

以下是我的输出:

    {"Items": [{"PresidentialCandidate_ID": {"S": "Trump"}, "Vote": {"N": "47"}}, {"PresidentialCandidate_ID": {"S": "Stein"}, "Vote": {"N": "16"}}, {"PresidentialCandidate_ID": {"S": "Dwayne"}, "Vote": {"N": "1"}}, {"PresidentialCandidate_ID": {"S": "none"}, "Vote": {"N": "11"}}, {"PresidentialCandidate_ID": {"S": "Johnson"}, "Vote": {"N": "13"}}, {"PresidentialCandidate_ID": {"S": "Clinton"}, "Vote": {"N": "22"}}], "Count": 6, "ScannedCount": 6}

我想要的输出:

    {"Items":[{"PresidentialCandidate_ID":"Trump","Vote":47},{"PresidentialCandidate_ID":"Stein","Vote":16},{"PresidentialCandidate_ID":"Dwayne","Vote":1},{"PresidentialCandidate_ID":"none","Vote":11},{"PresidentialCandidate_ID":"Johnson","Vote":13},{"PresidentialCandidate_ID":"Clinton","Vote":22}],"Count":6,"ScannedCount":6}

我尝试了以下方法:

    import boto3
    import json
    dynamodb = boto3.client('dynamodb')

    def lambda_handler(event, context):

        table = dynamodb.scan(TableName="PresidentialCandidate", ConsistentRead=True)
        del table['ResponseMetadata']
        table = json.dumps(table)
        print(table)

    return {
    }

关于如何过滤掉属性类型以获得我想要的输出有什么建议吗?

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-dynamodb boto3 boto


    【解决方案1】:

    您只能尝试使用此代码以您想要的方式返回数据。

    import boto3
    import json
    
    dynamodb = boto3.client('dynamodb')
    
    
    def lambda_handler(event, context):
        table = dynamodb.scan(TableName="PresidentialCandidate", ConsistentRead=True)
        items = table['Items']
    
        idx = 0
        for item in items:
            for key in item:
                value = list(item[key].values())[0]
                items[idx][key] = value
            idx += 1
        return items
    

    您也可以一次将新的所需格式化对象存储到表中。这样,attributeTypes 将不再反映,并且您可以在没有 attributeTypes 的情况下获得结果。你可以试试下面的代码来做到这一点:)

    import boto3
    import json
    
    dynamodb = boto3.client('dynamodb')
    
    
    def lambda_handler(event, context):
        table = dynamodb.scan(TableName="PresidentialCandidate", ConsistentRead=True)
        items = table['Items']
    
        idx = 0
        for item in items:
            for key in item:
                value = list(item[key].values())[0]
                # added this line to write and replace the old format by the new formatted object
                dynamodb.put_item(TableName="PresidentialCandidate", Item=item)   
                items[idx][key] = value
            idx += 1
        return items
    

    【讨论】:

    • 您的解决方案的输出不包括作为数字类型的投票,而是作为字符串类型。我正在寻找的所需输出具有用于投票的数字类型。如何从您的解决方案中获得投票成为数字?
    • 已解决 - 我添加了一个 if-else 语句以将投票转换为循环中的 Int。
    【解决方案2】:

    不要使用客户端,而是使用资源,这样我们就可以避免返回值中的数据类型:

    dynamodb = boto3.resource('dynamodb')
    table = dynamodb.Table("PresidentialCandidate")
    items=  table.scan()
    

    【讨论】:

    • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
    猜你喜欢
    • 2020-02-28
    • 1970-01-01
    • 2022-01-18
    • 2019-03-14
    • 2017-05-05
    • 2021-12-27
    • 2019-08-06
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多