AWS DynamoDBのフェッチ操作

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

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句

プロジェクション式 - Amazon DynamoDB


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