Получить элемент из таблицы DynamoDB с ключом диапазона, указав только ключ индекса.

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

user_id
timestamp_joined

Используя слой boto API, есть ли способ получить элемент, просто указав user_id (без ключа диапазона)? Каждый раз, когда я выполняю запрос getItem() без указания ключа диапазона, он терпит неудачу. Я могу заставить его работать, только указав ключ диапазона (timestamp_joined).

Сообщение об ошибке при выборке только по user_id приведено ниже:

boto.exception.DynamoDBResponseError: DynamoDBResponseError: 400 Bad Request 
{'message': 'One or more parameter values were invalid: The provided 
key size does ot match with that of the schema', '__type':
'com.amazon.coral.validate#ValidationException'} 

person ensnare    schedule 02.09.2012    source источник


Ответы (3)


Похоже, вы хотите выполнить запрос. Вы можете запросить таблицу, указав только user_id (хэш-ключ), и запрос вернет все элементы, соответствующие этому user_id, независимо от значения диапазона.

person garnaat    schedule 03.09.2012
comment
В этой таблице, например, user_id уникален. Мне все еще нужно запускать query(), даже если я ищу только один результат? Невозможно использовать getItem() только для хеш-ключа? Похоже, что range_key не следует указывать в этой таблице. - person ensnare; 03.09.2012
comment
Единственный способ выполнить get_item без указания ключа диапазона — это если схема таблицы не включает ключ диапазона. Итак, если отметка времени бесполезна в качестве вторичного ключа, я бы не стал включать ее в схему. - person garnaat; 03.09.2012

result = table.scan(Attr('user_id').eq(/number here/),
                    Limit=1,
                    ConsistentRead=True)

Если у вас есть более 1 элемента на user_id, вы можете ограничить результаты большим числом до 1 млн результатов на сканирование или запрос.

person WhiteRabbit    schedule 14.10.2015

Это работает для меня в диапазоне дат

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

И я сделал такой запрос:

import requests, json 
import boto3
from boto3.dynamodb.conditions import Key, Attr

def lambda_handler(event, context):
    dynamodb = boto3.resource('dynamodb', region_name='us-east-1', aws_access_key_id='your_access',aws_secret_access_key='your_secret')
    table = dynamodb.Table('Table_name')

    date_i = '2013-11-18'
    date_f = '2013-11-19'

    try:
        fe = Key('Date').between(date_i,date_f);
        response = table.scan(
            FilterExpression=fe
        )
        print(response['Items'])
    except Exception as e:
        print(e)
        raise e

У меня было 2 результата с этим диапазоном.

person qarly_blue    schedule 29.06.2021