You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动