从 DynamoDB 获取项目时出现“提供的关键元素与架构不匹配”错误
Posted
技术标签:
【中文标题】从 DynamoDB 获取项目时出现“提供的关键元素与架构不匹配”错误【英文标题】:"The provided key element does not match the schema" error when getting an item from DynamoDB 【发布时间】:2017-03-13 06:46:28 【问题描述】:这是表分区键设置
表格内容
当我尝试从表中获取项目时,它会打印此错误
botocore.exceptions.ClientError:发生错误 (ValidationException) 调用 GetItem 操作时:提供的 关键元素与架构不匹配
这是我的代码
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('testDynamodb')
response = table.get_item(Key='userId': "user2873")
item = response['Item']
print(item)
有什么想法吗?谢谢。
【问题讨论】:
【参考方案1】:您的表架构同时定义了哈希键和排序键。使用 DynamoDB GetItem 时,您必须同时提供它们,这里摘自documentation
对于主键,您必须提供所有属性。为了 例如,使用简单的主键,您只需要提供一个值 为分区键。对于复合主键,您必须提供 分区键和排序键的值。
鉴于您的示例,get_item 参数应如下所示:
response = table.get_item(Key='userId': "user2873", 'createdAt': "1489376547")
【讨论】:
'你的表模式定义了哈希键和分区键'——我有点想用'需要引用'来标记它?。你能解释一下如何从问题中的代码和图像中看出这一点吗? @MichaelScheper 实际上,hash key
和 partition key
是一回事。有趣的是以前没有人注意到这一点。所以它应该说“您的表架构同时定义了哈希键和排序键。”会解决这个问题。
@MichaelScheper 至于您的问题,您可以通过查看第一张图像(更准确地说,在 Primary partition key
和 @ 987654327@字段)
这是否意味着不可能在该表中查询所有在单个值上创建的记录? (所有用户都是在某个日期创建的?)这似乎很奇怪。 (新手到 dynamodb)
@JasonMichael 您不能使用 GetItem 执行此操作,您需要使用 Scan (docs.aws.amazon.com/amazondynamodb/latest/APIReference/…) 请注意,扫描操作意味着读取表中的所有记录,因此它可以作为单个操作时间使用,但如果您的应用不止一次需要此功能,请考虑调整您的表架构。【参考方案2】:
另一件有效的事情是下面的代码:
from boto3.dynamodb.conditions import Key
result = table.query(
KeyConditionExpression=Key('userId').eq('user2873')
)
【讨论】:
【参考方案3】:我也遇到了同样的问题。 解决方法是:
在创建表时,仅将 usrID
中的 schema
定义为 Hash
键。 [我的意思是单主键]
然后您可以根据您的usrID
调用get item。
如果您在表Schema
中将usrId
和createdAt
定义为Hash
和Sort
键。[我的意思是复合主键] 您必须在调用getItem 时同时提供这两者。
【讨论】:
【参考方案4】:我猜你不必把所有相关的属性都放好
在我的情况下,我只有一个 PK 作为 col
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();
【讨论】:
以上是关于从 DynamoDB 获取项目时出现“提供的关键元素与架构不匹配”错误的主要内容,如果未能解决你的问题,请参考以下文章
将 DAX 与 DynamoDB 一起使用时出现无法配置集群端点错误
将自动缩放策略应用于 DynamoDB 表时出现 ObjectNotFoundException
AWS Amplify + Graphql + Dynamodb:突变时出现 ConditionalCheckFailedException 错误