Запрос к таблице DynamoDB с использованием глобальных вторичных индексов - PullRequest
0 голосов
/ 13 марта 2020

Я пытался запросить таблицу DynamoDB с помощью функции Lambda.

Ключ раздела моей таблицы - id. Я пытаюсь запросить его по другому ключу с именем dipl_idpp. Я распутал, что это невозможно.

Я нашел здесь решение: мне нужно создать глобальный вторичный индекс, указывающий на столбец, по которому я хочу выполнить запрос (в моем случае dipl_idpp).

Я сделал это на Динамо. Но когда я выполняю свою функцию, у меня остается та же проблема:

An error occurred (ValidationException) when calling the Query operation: Query condition missed key schema element: id', 'occurred at index 0')"

Вот код, который я использую:

def query_dipl_dynamo(key_table,valeur_query,name_table):
    dynamoDBResource = boto3.resource('dynamodb')
    table = dynamoDBResource.Table(name_table)
    response = table.query(
    KeyConditionExpression=Key(key_table).eq(valeur_query))
    df_fr = pd.DataFrame([response['Items']])
    if len(df_fr.columns) > 0 :
        print("hellooo1")
        df = pd.DataFrame([response['Items'][0]])
        return valeur_query, df["dipl_libelle"].iloc[0]
//
//
df9_tmp["dipl_idpp"] = df8_tmp.apply(lambda x : query_dipl_dynamo("dipl_idpp",x["num_auto"], "ddb-dev-PS_LibreAcces_Dipl_AutExerc")[0], axis=1)

Должен ли я что-то изменить помимо создания индекса? Слишком мало документации доступно.

Спасибо!

1 Ответ

0 голосов
/ 13 марта 2020

Я только что нашел решение. Когда мы используем индексы, мы должны предоставить аргумент namde IndexName, который берет имя индекса в Dynamo. Я должен был изменить свой код на:

def query_dipl_dynamo(key_table,valeur_query,name_table):
    dynamoDBResource = boto3.resource('dynamodb')
    table = dynamoDBResource.Table(name_table)
    response = table.query(
    IndexName:"NameOfTheIndexInDynamoDB",
    KeyConditionExpression=Key(key_table).eq(valeur_query))
    df_fr = pd.DataFrame([response['Items']])
    if len(df_fr.columns) > 0 :
        df = pd.DataFrame([response['Items'][0]])
        return valeur_query, df["dipl_libelle"].iloc[0]
//
//
df9_tmp["dipl_idpp"] = df8_tmp.apply(lambda x : query_dipl_dynamo("dipl_idpp",x["num_auto"], "ddb-dev-PS_LibreAcces_Dipl_AutExerc")[0], axis=1)
...