クエリを使用して、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のドキュメントに含まれていないため、上記のエラーが発生する理由がわかりません。どんな洞察もありがたいです(これに新しく、少し失われました)。ありがとう
編集:私はハッシュキーと範囲キーの両方を持っています。特定のハッシュキーでクエリを実行できます。例えば、
x = tab.query(hash__eq="2014-01-20 05:06:29")
どのようにすればすべてのアイテムを取得できますか?
ああ、わかりました。誰かが必要な場合:
特定のハッシュキーを指定しないと、テーブルでクエリメソッドを使用できません。代わりに使用する方法はスキャンです。だから私が置き換える場合:
x = tab.query()
と
x = tab.scan()
テーブルのすべてのアイテムを取得します。
私はグルーヴィーですが、あなたにヒントを与えるつもりです。エラー:
{'message': 'Conditions can be of length 1 or 2 only'}
キーの条件は長さ1-> hashKeyのみ、または長さ2-> hashKey + rangeKeyである可能性があることを通知しています。キーの上にあるクエリにあるものはすべて、このエラーを引き起こします。このエラーの理由は次のとおりです。searchクエリを実行しようとしていますが、-key conditionクエリを使用しています。クエリを実行するには、個別の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)
DynamodbテーブルをクエリするときにKeyConditionExpression
ではなくFilterExpression
を誤って使用していたときに、このエラーに遭遇しました。
KeyConditionExpression
は、パーティションキーまたはソートキーの値でのみ使用する必要があります。結果をさらにフィルタリングする場合は、FilterExpression
を使用する必要があります。
ただし、FilterExpression
に基づいてクエリを実行するため、keyConditionExpression
を使用すると、それ以外の場合と同じ読み取りが使用されます。次に、FilterExpression
に基づいて結果からアイテムを削除します。
ソースクエリの操作