从 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 keypartition 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 中将usrIdcreatedAt 定义为HashSort 键。[我的意思是复合主键] 您必须在调用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 错误

对 DynamoDb 使用细粒度访问控制时出现 AccessDeniedException

尝试在DynamoDb中保存枚举时出现“类型不受支持”错误

带有 DynamoDB 后端的 terraform:创建新工作区时出现 400 Bad Request