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

时间:2017-03-13 06:46:28

标签: python amazon-dynamodb boto3

这是表分区键设置 enter image description here

表格内容 enter image description here

当我尝试从表格中获取某个项目时,会打印此错误

  

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

不匹配

这是我的代码

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

有什么想法吗?感谢。

4 个答案:

答案 0 :(得分:29)

您的表架构同时定义了散列键和排序键。使用DynamoDB GetItem时,您必须同时提供它们,这里摘录自documentation

  

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

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

response = table.get_item(Key={'userId': "user2873", 'createdAt': "1489376547"})

答案 1 :(得分:9)

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

from boto3.dynamodb.conditions import Key

result = table.query(
        KeyConditionExpression=Key('userId').eq('user2873')
    )

答案 2 :(得分:0)

我想您不必放置所有相关属性

在我的情况下,我只有一个PK作为上班族

const AWS = require('aws-sdk');
const ddb = new AWS.DynamoDB.DocumentClient();

exports.handler = (event, context, callback) => {
  const connectionId = event.requestContext.connectionId;
  deleteConnectionId(connectionId).then(() => {
    callback(null, { statusCode: 200 , message: 'userId deleted'});
  });
};


function deleteConnectionId(connectionId) {
  return ddb
    .delete({ TableName: 'your table name', 
        Key: {
            userId : connectionId.toString() // userId is my PK in this case
         }
    } )
    .promise();
}

答案 3 :(得分:0)

我也遇到了同样的问题。 解决办法是:

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

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