从DynamoDB获取项目时,"提供的关键元素与架构不匹配"错误

Keo*_*ros 22 python amazon-dynamodb boto3

这是表分区键设置 在此输入图像描述

表格内容 在此输入图像描述

当我试图从表中获取项目时,它会打印此错误

botocore.exceptions.ClientError:调用GetItem操作时发生错误(ValidationException):提供的键元素与架构不匹配

这是我的代码

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('testDynamodb')
response = table.get_item(Key={'userId': "user2873"})
item = response['Item']
print(item)
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢.

xtx*_*xtx 39

您的表模式同时定义了散列键和排序键.使用DynamoDB GetItem时,您必须提供它们,这里是文档的摘录

对于主键,您必须提供所有属性.例如,使用简单的主键,您只需要为分区键提供值.对于复合主键,必须为分区键和排序键提供值.

所以给出你的例子,这里是get_item参数的样子:

response = table.get_item(Key={'userId': "user2873", 'createdAt': "1489376547"})
Run Code Online (Sandbox Code Playgroud)

  • “你的表模式定义了哈希键和分区键”——我有点想用“需要引用”来标记它。您能解释一下如何从问题中的代码和图像中看出这一点吗? (2认同)
  • @MichaelScheper实际上,`hash key`和`partition key`是一回事.有趣的是之前没人注意到.所以它应该说'你的表模式同时定义了散列键和排序键'.会解决这个问题. (2认同)
  • @MichaelScheper至于你的问题,你可以通过查看第一个图像(更准确地说,在“主分区键”和“主排序键”字段)来判断该架构同时定义了分区(哈希)键和排序键。 (2认同)

use*_*036 12

另一个有效的方法是以下代码:

from boto3.dynamodb.conditions import Key

result = table.query(
        KeyConditionExpression=Key('userId').eq('user2873')
    )
Run Code Online (Sandbox Code Playgroud)


小智 5

我也有同样的问题。解决这个问题的方法是:

创建表时,仅usrID在您的schema键中定义Hash。[我的意思是单个主键]

然后你可以根据你的 调用 get item usrID。如果您在表中将usrId和定义为和Key。[我的意思是复合主键] 您必须在调用 getItem 时提供两者。createdAtSchemaHashSort