2014-02-02 3 views
10

Я пытаюсь получить все элементы в таблице 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'} 

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

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

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

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

ответ

17

Ahh ok, понял это. Если кому-то нужно:

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

x = tab.query() 

с

x = tab.scan() 

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

+8

Это не решение, вы не собираетесь использовать сканирование для вашего приложения логики, это очень дорого! Вы должны переосмыслить свои индексы и использовать запрос или get_item! –

+1

Сканирование - разумное решение для небольших таблиц. Источник: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScanGuidelines.html – Luhar

3

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

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

говорит вам, что ваш ключ условие может быть длиной 1 ->hashKey только, или длина 2 ->hashKey + rangeKey. Все, что находится в запросе на верхней части клавиш, вызовет эту ошибку. Причина этой ошибки: вы пытаетесь запустить запрос, но используя ключевое условие запрос. Вы должны добавить отдельный 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) 
-1

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

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 
+0

Это делает ** не ** ответ на вопрос полезным способом. _why_ вы считаете, что это ответ? _как это работает? Просто говорить кому-то об изменении своего кода без какого-либо контекста или смысла не помогает им узнать, что они сделали неправильно. – GrumpyCrouton

Смежные вопросы