"Приведенный ключевой элемент не соответствует ошибке схемы" при получении элемента из DynamoDB

Это настройка ключа раздела таблицы введите описание изображения здесь

Содержимое таблицы введите описание изображения здесь

Когда я попытался получить элемент из таблицы, он печатает эту ошибку

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 вы должны предоставить оба из них, вот выдержка из документации

Для первичного ключа вы должны предоставить все атрибуты. За Например, с простым первичным ключом вам нужно только указать значение для ключа раздела. Для составного первичного ключа вы должны предоставить значения для ключа раздела и ключа сортировки.

Итак, учитывая ваш пример, вот как должны выглядеть параметры get_item:

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

Ответ 2

Еще одна вещь, которая работает, это следующий код ниже:

from boto3.dynamodb.conditions import Key

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

Ответ 3

Я думаю, вам не нужно помещать все связанные атрибуты

в моем случае у меня есть только один 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();
}