Ресурс boto3 для запроса Dynamodb: условие запроса пропущен ключевой элемент схемы - PullRequest
2 голосов
/ 03 августа 2020

У меня есть таблица: AdvgCountries с двумя столбцами a. CountryId (String) (ключ раздела) b. CountryName (String) Sort Key При создании таблицы я создал только ключ раздела, а затем добавил глобальный вторичный индекс с именем индекса как:

CountryName-index
Type : GSI
Partition key : CountryId
Sort Key : CountryName

Я могу получить CountryName на основе CountryId, но не удалось получить CountryId на основе CountryName. Основываясь на моем чтении, я обнаружил, что есть варианты сделать это, предоставив indexname, но я получаю следующую ошибку:

botocore.exceptions.ClientError: произошла ошибка (ValidationException) при вызове запроса операция: условие запроса пропущен ключевой элемент схемы: CountryId

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

def query_bycountryname(pCountryname, dynamodb=None):
    if not dynamodb:
        dynamodb = boto3.resource('dynamodb', endpoint_url="https://dynamodb.us-east-1.amazonaws.com")

    table = dynamodb.Table('AdvgCountires')
    print(f"table")
    attributes = table.query(
        IndexName="CountryName-index",
        KeyConditionExpression=Key('CountryName').eq(pCountryname),
    )
    if 'Items' in attributes and len(attributes['Items']) == 1:
        attributes = attributes['Items'][0]

    print(f"before return")
    return attributes

if __name__ == '__main__':


    CountryName = "India"
    print(f"Data for {CountryName}")
    countries = query_bycountryname(CountryName)
    for country in countries:
       print(country['CountryId'], ":", country['CountryName'])

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 04 августа 2020

Вы не можете получить значение первичного ключа на основе ключа сортировки. DynamoDB так не работает.

В Dynamodb расположение каждого элемента определяется значением ha sh ключа раздела.

Операция запроса в Amazon DynamoDB находит элементы на основе значений первичного ключа.

KeyConditionExpression используются для написания условных операторов с помощью операторов сравнения, которые оценивают по ключу и ограничивают возвращаемые элементы. Другими словами, вы можете использовать специальные операторы для включения, исключения и сопоставления элементов по их значениям ключей сортировки .

...