Python中DynamoDB PartiQL查询结果如何去除类型并转换格式?
使用boto3 PartiQL查询DynamoDB后转换结果格式的方法
问题描述
使用boto3客户端通过PartiQL查询DynamoDB表时,返回结果包含DynamoDB的类型标识(如S代表字符串、N代表数字),且数值以字符串形式返回,示例代码及返回结果如下:
查询代码
dynamodb = boto3.client( 'dynamodb', aws_access_key_id='<aws_access_key_id>', aws_secret_access_key='<aws_secret_access_key>', region_name='<region_name>' ) resp = dynamodb.execute_statement(Statement='SELECT * FROM TryDaxTable')
当前返回结果
{'some_data': {'S': 'XXX'}, 'sort_key': {'N': '1'}, 'partition_key': {'N': '7'} }
需要将结果转换为不带类型标识、值为正确数据类型的格式,支持列表和嵌套字典等复杂结构,目标格式如下:
{'some_data': 'XXX', 'sort_key': 1, 'partition_key': 7 }
解决方案
方法1:改用boto3 Resource(推荐)
boto3的resource接口会自动将DynamoDB的类型格式转换为原生Python类型,无需手动解析。示例代码:
import boto3 # 初始化DynamoDB Resource dynamodb = boto3.resource( 'dynamodb', aws_access_key_id='<aws_access_key_id>', aws_secret_access_key='<aws_secret_access_key>', region_name='<region_name>' ) # 执行PartiQL查询 resp = dynamodb.execute_statement(Statement='SELECT * FROM TryDaxTable') # 获取解析后的结果 parsed_items = resp['Items']
此时parsed_items中的每个项都是直接可用的原生类型字典,自动处理嵌套结构和列表。
方法2:使用TypeDeserializer手动解析(适用于必须用Client的场景)
如果需要保留client接口,可以使用boto3内置的TypeDeserializer类来解析DynamoDB格式的数据,它支持递归处理嵌套结构和列表:
import boto3 from boto3.dynamodb.types import TypeDeserializer # 初始化客户端和反序列化器 dynamodb = boto3.client( 'dynamodb', aws_access_key_id='<aws_access_key_id>', aws_secret_access_key='<aws_secret_access_key>', region_name='<region_name>' ) deserializer = TypeDeserializer() # 执行查询 resp = dynamodb.execute_statement(Statement='SELECT * FROM TryDaxTable') # 批量解析结果 parsed_items = [] for item in resp['Items']: parsed_item = {k: deserializer.deserialize(v) for k, v in item.items()} parsed_items.append(parsed_item)
TypeDeserializer会自动识别所有DynamoDB类型标识(包括L列表、M嵌套字典等),并转换为对应的Python类型。
内容的提问来源于stack exchange,提问作者Minura Punchihewa
相关产品推荐
相关产品推荐

