web-dev-qa-db-ja.com

PythonでAWS DynamoDBにクエリするにはどうすればよいですか?

NoSQLはかなり新しく、AWS DynamoDBを使用しています。 python= 2.7を使用してAWS Lambdaから呼び出しています。2.7「order_number」フィールドから値を取得しようとしています。
これは私のテーブルの外観です(レコードは1つだけです)。
enter image description here

プライマリパーティションキー:subscription_id enter image description here


と私の二次グローバルインデックス:order_number
enter image description here

私の設定は正しいですか?その場合、order_numberを指定して、Pythonを使用してレコードを取得するにはどうすればよいですか?
構文を理解できません。

私はもう試した

response = table.get_item( Key = {'order_number': myordernumber} )

しかし、私は得る:
GetItem操作の呼び出し時にエラーが発生しました(ValidationException):指定されたキー要素がスキーマと一致しません:ClientError

13
altoids

DynamoDBは、オブジェクトのすべてのフィールドに自動的にインデックスを付けるわけではありません。デフォルトでは、ハッシュキー(subscription_idの場合)を定義でき、オプションで範囲キーを定義すると、それらにインデックスが付けられます。だから、これを行うことができます:

response = table.get_item(Key={'subscription_id': mysubid})

期待どおりに動作します。ただし、order_numberに基づいてアイテムを取得する場合は、scan操作を使用して、テーブル内のすべてのアイテムを調べ、正しい値を持つアイテムを見つける必要があります。これは非常に高価な操作です。または、order_numberを主キーとして使用するグローバルセカンダリインデックスをテーブルに作成することもできます。それを行って新しいインデックスorder_number-indexを呼び出した場合、次のように特定の注文番号に一致するオブジェクトをクエリできます。

from boto3.dynamodb.conditions import Key, Attr

response = table.query(
    IndexName='order_number-index',
    KeyConditionExpression=Key('order_number').eq(myordernumber))

DynamoDBは非常に高速でスケーラブルで効率的なデータベースですが、どのフィールドを検索するのか、どのように効率的に行うのかについて多くのことを考える必要があります。

良いニュースは、GSIを既存のテーブルに追加できるようになったことです。以前は、テーブルを削除して最初からやり直す必要がありました。

14
garnaat

これをインポートしたことを確認してください:

from boto3.dynamodb.conditions import Key, Attr

それがない場合は、間違いなくエラーが発生します。 ドキュメントの例 にあります。

これは私にとって正しい答えなので、上記のコメントを@altoidsに感謝します。 「フォーマル」な答えで注目を集めたかった。

9
user3303554