AWS DynamoDB Python - методы boto3 Key () не распознаются (запрос)

Я использую Lambda (Python) для запроса моей базы данных DynamoDB. Я использую библиотеку boto3, и мне удалось сделать «эквивалентный» запрос:

Этот скрипт работает:

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

def create_list(event, context):
    resource = boto3.resource('dynamodb')
    table = resource.Table('Table_Name')

    response = table.query(
        TableName='Table_Name',
        IndexName='Custom-Index-Name',
        KeyConditionExpression=Key('Number_Attribute').eq(0)
    )
    return response

Однако, когда я меняю выражение запроса на это:

KeyConditionExpression=Key('Number_Attribute').gt(0)

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

"errorType": "ClientError",
  "errorMessage": "An error occurred (ValidationException) when calling the Query operation: Query key condition not supported"

Согласно этому [1] ресурсу, «gt» - это метод Key (). Кто-нибудь знает, обновлялась ли эта библиотека или какие еще методы доступны кроме "eq"?

[1] http://boto3.readthedocs.io/en/latest/reference/customizations/dynamodb.html#ref-dynamodb-conditions

--------- РЕДАКТИРОВАТЬ ----------

Я также просто попробовал старый метод, используя:

response = client.query(
        TableName = 'Table_Name',
        IndexName='Custom_Index',
        KeyConditions = {
            'Custom_Number_Attribute':{
                'ComparisonOperator':'EQ',
                'AttributeValueList': [{'N': '0'}]
            }
        }
    )

Это сработало, но когда я пытаюсь:

response = client.query(
            TableName = 'Table_Name',
            IndexName='Custom_Index',
            KeyConditions = {
                'Custom_Number_Attribute':{
                    'ComparisonOperator':'GT',
                    'AttributeValueList': [{'N': '0'}]
                }
            }
        )

...это не работает.

Почему в таких случаях работает только эквалайзер? Я не уверен, что мне не хватает в документации.


person sean    schedule 25.05.2016    source источник
comment
предположим ссылку на эту документацию: boto3.readthedocs .io / en / latest / reference / services /   -  person mootmoot    schedule 30.05.2016


Ответы (1)


Из того, что я думаю: ваш ключ раздела - Number_Attribute, поэтому вы не можете сделать gt при выполнении query (вы можете сделать eq, и все).

Вы можете сделать gt или between для своего ключа сортировки при выполнении query. Его также называют ключом диапазона, и поскольку он «разумно» помещает элементы рядом друг с другом, он дает возможность эффективно выполнять gt и between в query

Теперь, если вы хотите сделать between для своего ключа раздела, вам нужно будет использовать scan, как показано ниже:

Key('Number_Attribute').gt(0)
response = table.scan(
    FilterExpression=fe
)

При сканировании помните следующее:

Метод сканирования считывает каждый элемент во всей таблице и возвращает все данные в таблице. Вы можете указать необязательное выражение filter_expression, чтобы возвращались только элементы, соответствующие вашим критериям. Однако обратите внимание, что фильтр применяется только после сканирования всей таблицы.

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

Надеюсь, это поможет!

person Guy Daher    schedule 31.05.2016
comment
Извините за задержку, я действительно получил тот же ответ от службы поддержки AWS. Вы совершенно правы, для первичного ключа требуется eq. Я решаю эту проблему, всегда добавляя атрибут в каждую таблицу, который содержит одно и то же значение для всех записей, которые я хочу запросить. Таким образом, я могу выполнять запрос, а также иметь возможность удалять элементы из доступности (изменяя значение этого общего атрибута) для общего запроса. Таким образом, он похож на сканирование, но дает еще несколько вариантов. - person sean; 12.09.2017