Получить все элементы из DynamoDB с помощью запроса?

Я пытаюсь получить все элементы в таблице dynamodb с помощью запроса. Ниже мой код:

import boto.dynamodb2
from boto.dynamodb2.table import Table
from time import sleep

c    = boto.dynamodb2.connect_to_region(aws_access_key_id="XXX",aws_secret_access_key="XXX",region_name="us-west-2")

tab  = Table("rip.irc",connection=c)

x    = tab.query()

for i in x:
    print i
    sleep(1)

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

ValidationException: ValidationException: 400 Bad Request
{'message': 'Conditions can be of length 1 or 2 only', '__type': 'com.amazon.coral.validate#ValidationException'}

Код, который у меня есть, довольно прост и из документа boto dynamodb2, поэтому я не уверен, почему я получаю вышеуказанную ошибку. Любые идеи были бы оценены (новинка к этому и немного потерянная). Благодаря

EDIT: У меня есть как хэш-ключ, так и клавиша диапазона. Я могу запросить конкретные хэш-ключи. Например,

x = tab.query(hash__eq="2014-01-20 05:06:29")

Как я могу получить все элементы?

Ответ 1

Да, хорошо, понял. Если кому-то нужно:

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

x    = tab.query()

с

x    = tab.scan()

Я получаю все элементы в своей таблице.

Ответ 2

Я нахожусь на groovy, но он подскажет вам намек. Ошибка:

{'message': 'Conditions can be of length 1 or 2 only'}

сообщает вам, что ваше ключевое условие может быть длиной 1 → hashKey только, или длиной 2 → hashKey + rangeKey. Все, что в запросе на верхней части клавиш вызовет эту ошибку. Причина этой ошибки заключается в следующем: вы пытаетесь запустить запрос search, но с помощью запроса ключевого условия. Вы должны добавить отдельный filterCondition, чтобы выполнить свой запрос.  Мой код

    String keyQuery = " hashKey = :hashKey and rangeKey between :start and :end "
    queryRequest.setKeyConditionExpression(keyQuery)// define key query
    String filterExpression = " yourParam = :yourParam "
    queryRequest.setFilterExpression(filterExpression)// define filter expression
    queryRequest.setExpressionAttributeValues(expressionAttributeValues)
    queryRequest.setSelect('ALL_ATTRIBUTES')
    QueryResult queryResult = client.query(queryRequest)

Ответ 3

Я столкнулся с этой ошибкой, когда я неправильно использовал KeyConditionExpression вместо FilterExpression при запросе таблицы DynamodB.

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

Однако обратите внимание, что при использовании FilterExpression используются те же keyConditionExpression чтения, что и без него, поскольку он выполняет запрос на основе keyConditionExpression. Затем он удаляет элементы из результатов на основе вашего FilterExpression.

Источник Работа с запросами

Ответ 4

Вот как я делаю запрос, если кому-то все еще нужно решение:

def method_name(a, b)
    results = self.query(
      key_condition_expression: '#T = :t',
      filter_expression: 'contains(#S, :s)',
      expression_attribute_names: {
        '#T' => 'your_table_field_name',
        '#S' => 'your_table_field_name'
      },
      expression_attribute_values: {
        ':t' => a,
        ':s' => b
      }
    )
    results
  end