У меня есть поле date_time в таблице Dynamo-db. Как я могу запросить только записи между двумя указанными c датами? - PullRequest
0 голосов
/ 06 мая 2020

Я использую boto3. Имя таблицы - exapmle_table. Я хочу получить только указанные c часовые записи в соответствии с полем date_time.

Пока что я пробовал это безуспешно:

def read_from_dynamodb():
    now = datetime.datetime.now()
    one_hour_ago = now - datetime.timedelta(hours=1)
    now = timestamp = now.replace(tzinfo=timezone.utc).timestamp()
    now = int(now)
    one_hour_ago = one_hour_ago.replace(tzinfo=timezone.utc).timestamp()
    one_hour_ago = int (one_hour_ago)

    dynamodb = boto3.resource("dynamodb", aws_access_key_id=RnD_Credentials.aws_access_key_id,
                              aws_secret_access_key=RnD_Credentials.aws_secret_access_key,
                              region_name=RnD_Credentials.region
                              )
    example_table = dynamodb.Table('example_table')

    response = example_table.query(
        IndexName='date_time',
        KeyConditionExpression=Key('date_time').between(one_hour_ago, now)
    )
    return response

Я получаю сообщение об ошибке:

botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the Query operation: The table does not have the specified index: date_time

1 Ответ

0 голосов
/ 06 мая 2020

Запросы, которые полагаются на диапазоны, включая between, должны, чтобы атрибут (в вашем случае date_time) был ключом сортировки в индексе (первичном или другом), и вам также необходимо будет предоставить ключ раздела в составе KeyConditionExpression. Вы не можете запросить всю таблицу по ключу сортировки, если все элементы в таблице не имеют одинаковый ключ раздела.

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

Другой вариант, если вы пишете данные самостоятельно, - создать новый атрибут с начальным временем часа для этого элемента date_time то есть квантовать его, затем создать ключ GSI ha sh для этого нового атрибута часа. Затем вы можете запросить этот конкретный c час, а не искать диапазоны. Если вы работаете с существующими данными, вы можете сканировать и реорганизовать свою таблицу, чтобы добавить этот атрибут - не идеально, но может быть решением в зависимости от размера таблицы и вашего варианта использования.

Если вы действительно застрял, вы также можете scan и отфильтровать таблицу вместо query, но это гораздо менее эффективно, поскольку требует чтения каждого элемента каждый раз, когда вы его выполняете.

...