You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将DynamoDB扫描API的带类型响应转为键值对格式?

处理DynamoDB扫描结果的类型转换与分页问题

方案一:使用boto3.client配合内置类型转换

boto3自带TypeDeserializer类,能直接把带数据类型标识的DynamoDB格式数据转成普通键值对字典,同时手动处理扫描分页逻辑,确保拿到所有数据:

import boto3
from boto3.dynamodb.types import TypeDeserializer

# 初始化客户端与反序列化器
dynamodb_client = boto3.client('dynamodb')
deserializer = TypeDeserializer()

def parse_dynamodb_item(item):
    """将单条DynamoDB格式数据转为普通键值对"""
    return {key: deserializer.deserialize(value) for key, value in item.items()}

def full_scan_table(table_name):
    all_items = []
    last_key = None
    while True:
        scan_params = {'TableName': table_name}
        if last_key:
            scan_params['ExclusiveStartKey'] = last_key
        response = dynamodb_client.scan(**scan_params)
        # 转换当前页所有数据并加入结果列表
        all_items.extend([parse_dynamodb_item(item) for item in response['Items']])
        last_key = response.get('LastEvaluatedKey')
        # 没有下一页时退出循环
        if not last_key:
            break
    return all_items

# 调用示例
result = full_scan_table('your_target_table')

方案二:使用boto3.resource(无需担心条目数量限制)

你之前顾虑的条目数量限制不存在——boto3.resource的高层API会自动处理扫描分页,返回的是迭代器,后台会自动请求下一页数据直到获取所有条目,且返回结果本身就是纯键值对格式,无需额外转换:

import boto3

# 初始化资源与表对象
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('your_target_table')

# 扫描并获取所有数据,自动处理分页
all_items = []
for item in table.scan()['Items']:
    all_items.append(item)

# 更简洁的写法
all_items = list(table.scan()['Items'])

补充说明

  • TypeDeserializer支持所有DynamoDB数据类型(字符串、数字、布尔、列表、映射等)的转换,比自行编写解析逻辑更可靠。
  • 不管是client还是resource的扫描接口,单页最多返回1MB数据(具体条目数取决于单条数据大小),但只要正确处理分页(resource自动处理,client手动处理),就能获取3000-10000条甚至更多数据,无数量上限。

内容的提问来源于stack exchange,提问作者K P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 02:45:02