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?
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.
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)
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