当我尝试从表格中获取某个项目时,会打印此错误
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)
有什么想法吗?感谢。
答案 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
表中的 createdAt
和 Schema
定义为 Hash
和 Sort
键。[我的意思是复合主键] 您必须同时提供两者调用 getItem。