web-dev-qa-db-ja.com

クエリを使用して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のドキュメントに含まれていないため、上記のエラーが発生する理由がわかりません。どんな洞察もありがたいです(これに新しく、少し失われました)。ありがとう

編集:私はハッシュキーと範囲キーの両方を持っています。特定のハッシュキーでクエリを実行できます。例えば、

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

どのようにすればすべてのアイテムを取得できますか?

19
dlaser

ああ、わかりました。誰かが必要な場合:

特定のハッシュキーを指定しないと、テーブルでクエリメソッドを使用できません。代わりに使用する方法はスキャンです。だから私が置き換える場合:

x    = tab.query()

x    = tab.scan()

テーブルのすべてのアイテムを取得します。

37
dlaser

私はグルーヴィーですが、あなたにヒントを与えるつもりです。エラー:

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

DynamodbテーブルをクエリするときにKeyConditionExpressionではなくFilterExpressionを誤って使用していたときに、このエラーに遭遇しました。

KeyConditionExpressionは、パーティションキーまたはソートキーの値でのみ使用する必要があります。結果をさらにフィルタリングする場合は、FilterExpressionを使用する必要があります。

ただし、FilterExpressionに基づいてクエリを実行するため、keyConditionExpressionを使用すると、それ以外の場合と同じ読み取りが使用されます。次に、FilterExpressionに基づいて結果からアイテムを削除します。

ソースクエリの操作

2
Dylan w