使用Python3的Boto3向AWS DynamoDB插入Map列表报TypeError问题
错误原因
报错TypeError: string indices must be integers触发在member['id']执行行,核心原因是当前循环得到的member为字符串类型,而非你预期的字典结构:Python中字符串仅支持整数下标访问,使用字符串作为索引就会触发该类错误。
常见触发场景:
- 你赋值给
team的变量本身是JSON字符串而非列表,遍历字符串时每次取到的member是单个字符的字符串 team确实是列表,但列表内的元素是序列化后的JSON字符串,没有提前反序列化为字典- 上游传入的
team数据结构不符合预期,你错误将上层的字符串字段赋值给了team变量
修复方案
- 先排查
team的数据类型,在循环前加调试代码确认值和类型:
print(type(team), team)
如果输出类型为<class 'str'>,先通过json库反序列化字符串为Python对象:
import json team = json.loads(team)
- 如果
team是列表但元素为JSON字符串,遍历每个元素时先反序列化再操作:
teamMembers = [] for member_str in team: member = json.loads(member_str) teamMembers.append({'M' : { 'id' : {'S' : member['id']}, 'role' : {'S' : member['role']}, 'name' : {'S' : member['name']} }})
- 可选优化:可以使用Boto3的Resource级DynamoDB客户端,不需要手动指定DynamoDB原生字段类型(S/M/L等标识),会自动完成Python类型到DynamoDB类型的转换,代码更简洁:
import boto3 import json # 初始化Resource级客户端 dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('projects') # 直接使用Python原生数据结构操作 teamMembers = [] for member in team: teamMembers.append({ 'id': member['id'], 'role': member['role'], 'name': member['name'] }) project = { 'id': data['project']['id'], 'name': data['project']['name'], 'team': teamMembers } table.put_item(Item=project)
内容的提问来源于stack exchange,提问作者Devin Ceartas
相关产品推荐
相关产品推荐

