如何自动格式化DynamoDB返回项以原样或修改后重新存入?
解决方案
问题根源在于boto3的resource和client对DynamoDB数据的格式要求不同:
- Resource返回的是原生Python类型(如字符串、Decimal),适合直接在代码中使用
- Client的
put_item方法要求传入带类型标注的DynamoDB格式(如{'S': '字符串值'}、{'N': '数字字符串'})
你可以通过boto3自带的工具完成转换,无需手动修改数据:
方法1:用TypeSerializer转换格式
boto3内置了TypeSerializer类,能自动将原生Python类型转换成Client需要的DynamoDB格式:
from boto3.dynamodb.types import TypeSerializer # 初始化序列化器 serializer = TypeSerializer() # 转换单个数据项 serialized_item = {key: serializer.serialize(value) for key, value in foo.items()} # 现在可以用client正常存入 cdb.put_item(TableName='my-table', Item=serialized_item, ReturnValues="ALL_OLD")
如果需要批量转换多个Item,直接循环处理即可:
serialized_items = [{k: serializer.serialize(v) for k, v in item.items()} for item in my_data]
方法2:直接用Resource的put_item方法
既然你已经通过Resource获取了数据,更简单的方式是直接用Resource对象的put_item方法,它会自动处理类型映射,无需手动转换:
# 直接调用Resource中table对象的put_item table.put_item(Item=foo, ReturnValues="ALL_OLD")
这种方式省去了格式转换的步骤,更符合boto3 Resource的设计初衷。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

