Как искать данные в Динамо с использованием Python - PullRequest
0 голосов
/ 05 марта 2019

Теперь у меня есть столбец, как показано ниже (Statuscode_Env) в Dynamodb в качестве ключа раздела.

1. Здесь, когда я передаю значение типа (421, 425 и т. Д.), Он должен давать соответствующий код, существующий(как PRD здесь).

2. И наоборот, если я передаю параметр как PRD, он должен давать соответствующие числа, такие как (421, 425, 427 и т. Д.).

Я могу добиться ниже, введя 2столбцы (ключ детали, ключ сортировки).Первый случай я могу достичь, но второй случай я не могу.Потому что я могу искать только используя ключ раздела.Следовательно, хранение данных в одном столбце с разделителем как «пробел»

Statuscode_Env
421 PRD
425 PRD
427 PRD
422 PRD
426 PRD
423 PRD
429 PRD
428 PRD
422 PRD

import boto3
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('env')
response = table.query(KeyConditionExpression=Key('Statuscode_Env').eq('422 PRD'))
for i in response['Items']:
    print(i['Statuscode_Env'])

Сделано вышеописанным способом, не правильно ... Пробовал с 'Contatins' и 'beginwith', но не получилось.

И предположим, если я хочу обновить код / ​​имя, как я могу реализовать использование python и DynamodB.

name | code
-----------
PRD  | 425
PRD  | 456
PRD  | 427

1 Ответ

0 голосов
/ 07 марта 2019

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

Используйте параметр KeyConditionExpression, чтобы указать конкретное значение ключа раздела.Операция Query вернет все элементы из таблицы или индекса с этим значением ключа раздела.При желании вы можете сузить область действия запроса, указав значение ключа сортировки и оператор сравнения в KeyConditionExpression.

Та же документация продолжается с

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

Таким образом, вы можете использовать FilterExpression, чтобы еще больше сузить набор результатов, что может обеспечить поддержку для вашего второго варианта использования.

Если этонедостаточно, вам, вероятно, нужно изучить с использованием индексов , Global Secondary Index (GSI) специально.В основном индекс создаст другую таблицу с другими ключами.Чтобы удовлетворить ваше второе требование, я думаю, что может работать следующая структура GSI:

name | code
-----------
PRD  | 425
PRD  | 456
PRD  | 427
....

Где name - ключ раздела, а код - ключ сортировки.Но эти пары атрибутов всегда должны составлять уникальный первичный ключ для каждой записи, в противном случае вы не сможете использовать эту структуру.

Приложение : после просмотра моего поста и перечитывания вашего вопроса я понял,что у вас нет отдельных атрибутов имени и кода, но есть один атрибут с такими данными, как «PRD 425» и «PRD 426».У меня нет опыта в этом.В документации Query снова говорится следующее о KeyConditionExpression

Условие, которое указывает значения ключа для элементов, которые должны быть получены действием Query.

Условие должно выполнятьсятест на равенство для одного значения ключа секции.

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

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

Приложение 2 : После долгих раздумий я вспомнил, что Документация DynamoDB обычно предлагает стратегию, в которой к ключу раздела добавляется случайный номернапример.К сожалению, у меня нет подробной информации о том, как выполнять запросы к этой схеме, но она должна дать вам советы по организации ваших данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...