web-dev-qa-db-fra.com

Récupérer tous les éléments de DynamoDB à l'aide d'une requête?

J'essaie de récupérer tous les éléments d'une table dynamodb à l'aide d'une requête. Voici mon code:

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)

Cependant, je reçois l'erreur suivante:

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

Le code que j'ai est assez simple et hors des documents boto dynamodb2, donc je ne sais pas pourquoi j'obtiens l'erreur ci-dessus. Toutes les idées seraient appréciées (nouvelles à cela et un peu perdues). Merci

EDIT: J'ai à la fois une touche de hachage et une touche de plage. Je peux interroger par des clés de hachage spécifiques. Par exemple,

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

Comment puis-je récupérer tous les articles?

19
dlaser

Ahh ok, compris. Si quelqu'un a besoin:

Vous ne pouvez pas utiliser la méthode de requête sur une table sans spécifier une clé de hachage spécifique. La méthode à utiliser à la place est la numérisation. Donc si je remplace:

x    = tab.query()

avec

x    = tab.scan()

Je reçois tous les articles de ma table.

37
dlaser

Je suis sur groovy mais ça va vous laisser un indice. Erreur :

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

vous indique que votre condition de clé peut être de longueur 1 -> hashKey uniquement, ou de longueur 2 -> hashKey + rangeKey. Tout ce qui se trouve dans une requête sur un dessus de clé provoquera cette erreur. La raison de cette erreur est: vous essayez d'exécuter la requête search mais en utilisant la requête condition clé. Vous devez ajouter des filterCondition séparés pour effectuer votre requête. Mon code

    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)
9
Vadim

J'ai rencontré cette erreur lorsque j'utilisais mal KeyConditionExpression au lieu de FilterExpression lors de l'interrogation d'une table dynamodb.

KeyConditionExpression ne doit être utilisé qu'avec des valeurs de clé de partition ou de clé de tri. FilterExpression doit être utilisé lorsque vous souhaitez filtrer encore plus vos résultats.

Cependant, notez que l'utilisation de FilterExpression utilise les mêmes lectures qu'elle le ferait sans, car elle exécute la requête en fonction de keyConditionExpression. Il supprime ensuite les éléments des résultats en fonction de votre FilterExpression.

Source tilisation des requêtes

2
Dylan w