Python boto3でのDynamoDBのデータフェッチ。一覧性のあるデータを取得する場合はquery
メソッドを使用します。
ステップ 4: データをクエリおよびスキャンする - Amazon DynamoDB
scan
でもフィルタリングは出来るが、全件取得した後にフィルタするので、速度の面でも金額費用の面でも使用するべきではない。と思います。
サンプルコード
field1をPartitionKey
、field2をSortKey
とします。
import boto3 from boto3.dynamodb.conditions import Key dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('yourTableName') response = table.query( ProjectionExpression="field1, field2", KeyConditionExpression= Key('field1').eq('value1') & Key('field2').ge(1) )
ProjectionExpression
ProjectionExpression
は取得するフィールドを指定できる。RDBの言うところのSELECT句
。
KeyConditionExpression
KeyConditionExpression
で、フェッチ対象とするレコードの条件を記述する。RDBで言うところのWHERE句
。
KeyConditions - Amazon DynamoDB
ExpressionAttributeNames
また、各式にDynamoDBの式予約語
が含まれる場合、
# yearは予約後 ... ProjectionExpression="#yr", ExpressionAttributeNames={"#yr": "year"}, ...
と、プレースホルダを埋め込むスタイルで回避できる。
試してはないんだけど、公式のドキュメントではKeyConditionExpression= Key('year').eq(1992)
では大丈夫みたい。Keyメソッドがよしなにやってくれてるのかな。
セカンダリインデックスでのquery
セカンダリインデックスは作成したインデックス名
を指定して使用します。インデックスはテーブルとは別のパーテーションで定義されている為だと思います。
インデックスのクエリの実行およびスキャン - Amazon DynamoDB
import boto3 from boto3.dynamodb.conditions import Key dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('yourTableName') response = table.query( IndexName='makedIndexName', KeyConditionExpression=Key('indexField').eq(0) )
リンク