AWS DynamoDB get_item报ValidationException,求代码排查修正
解决DynamoDB GetItem ValidationException错误
我一眼就看出问题所在啦——你用了DynamoDB低级API的属性格式(带类型标记的{"S": "1"}),但你用的是boto3的resource接口(dynamodb.Table),这个接口支持直接传入原生Python类型,根本不需要手动指定类型!
错误原因
当你使用boto3的resource模式操作DynamoDB时,它会自动帮你处理数据类型的转换。而你传入的{"S": str(1)}是client模式(低级API)专属的格式,这就导致DynamoDB判定你的主键格式和表定义的schema不匹配,直接抛出了ValidationException。
修正后的代码
把主键值直接传原生类型就行,不用加类型封装:
def read_table_item(table_name, pk_name, pk_value): """ Return item read by primary key. """ table = dynamodb.Table(table_name) response = table.get_item( Key={pk_name: pk_value}) return response # 注意:根据你表的主键类型传对应值 # 如果主键是数字类型,直接传int print(read_table_item(table_name, pk_name="_id", pk_value=1)) # 如果主键是字符串类型,传str # print(read_table_item(table_name, pk_name="_id", pk_value=str(1)))
补充小提示
- 若你的表主键是数字(N),直接传Python的
int/float即可 - 若主键是字符串(S),直接传Python的
str就行 - 只有使用boto3的
client接口(比如dynamodb_client = boto3.client('dynamodb'))时,才需要用{"S": "value"}这种带类型标记的格式
内容的提问来源于stack exchange,提问作者MeghP




