DynamoDBのQuery操作は、テーブルまたはインデックスのパーティションキーを指定し、条件に一致するデータを取得するために使用します。この備忘録では、基本的な使い方から応用例までを紹介します。
目次
必要なモジュールのインポート
import boto3
from boto3.dynamodb.conditions import Key, Attr
boto3: AWS SDK for Python。boto3.dynamodb.conditions.Key:KeyConditionExpressionに使用。boto3.dynamodb.conditions.Attr:FilterExpressionに使用。
DynamoDBリソースの初期化
DynamoDBテーブルを操作するには、Boto3リソースまたはクライアントを使用します。
# DynamoDBリソースの初期化
dynamodb = boto3.resource('dynamodb')
# テーブルを指定
table = dynamodb.Table('YourTableName')
基本的なQuery操作
パーティションキーのみを指定
from boto3.dynamodb.conditions import Key
response = table.query(
KeyConditionExpression=Key('partition_key').eq('your_partition_value')
)
# 結果を表示
for item in response['Items']:
print(item)
パーティションキー + ソートキー条件
response = table.query(
KeyConditionExpression=(
Key('partition_key').eq('your_partition_value') &
Key('sort_key').gte('2023-01-01') # ソートキーの条件を追加
)
)
# 結果を表示
for item in response['Items']:
print(item)
結果のソート順を変更
昇順(デフォルト)
response = table.query(
KeyConditionExpression=Key('partition_key').eq('your_partition_value'),
ScanIndexForward=True # 昇順
)
降順
response = table.query(
KeyConditionExpression=Key('partition_key').eq('your_partition_value'),
ScanIndexForward=False # 降順
)
フィルタリングを追加
FilterExpression を使用
FilterExpression を使用すると、データの一部を除外できます。
response = table.query(
KeyConditionExpression=Key('partition_key').eq('your_partition_value'),
FilterExpression=Attr('attribute_name').contains('example_value') # 属性のフィルタリング
)
注意: FilterExpression はDynamoDBから取得したデータのフィルタリングを行います。KeyConditionExpression とは異なり、データスキャン後にフィルタリングされるためコストが増加する可能性があります。
結果のページング処理
DynamoDBはデフォルトで1MBのデータを返します。結果が複数ページにわたる場合、LastEvaluatedKey を使用して次のページを取得します。
response = table.query(
KeyConditionExpression=Key('partition_key').eq('your_partition_value')
)
items = response['Items']
# ページング処理
while 'LastEvaluatedKey' in response:
response = table.query(
KeyConditionExpression=Key('partition_key').eq('your_partition_value'),
ExclusiveStartKey=response['LastEvaluatedKey'] # 次のページの開始キー
)
items.extend(response['Items'])
# 全データを表示
for item in items:
print(item)
インデックスを使用したQuery
ローカルセカンダリインデックス(LSI)やグローバルセカンダリインデックス(GSI)を指定してクエリを実行できます。
例: GSIの指定
response = table.query(
IndexName='YourGSIName', # インデックス名を指定
KeyConditionExpression=Key('gsi_partition_key').eq('value')
)
エラーハンドリング
DynamoDB操作中にエラーが発生する場合に備えて、エラーハンドリングを追加します。
try:
response = table.query(
KeyConditionExpression=Key('partition_key').eq('your_partition_value')
)
for item in response['Items']:
print(item)
except Exception as e:
print(f"エラーが発生しました: {e}")
実際のデータ例
テーブル構造
| Partition Key | Sort Key | Data |
|---|---|---|
| user1 | 2023-01-01 | Entry A |
| user1 | 2023-01-02 | Entry B |
| user2 | 2023-01-01 | Entry C |
クエリ結果例
クエリ: Key('partition_key').eq('user1') & Key('sort_key').gte('2023-01-01')
結果:
[
{ "Partition Key": "user1", "Sort Key": "2023-01-01", "Data": "Entry A" },
{ "Partition Key": "user1", "Sort Key": "2023-01-02", "Data": "Entry B" }
]
注意点とベストプラクティス
- 適切なインデックス設計:
- 効率的なクエリを実現するため、事前にパーティションキーとソートキーを適切に設計します。
FilterExpressionの使用を最小限に:KeyConditionExpressionを活用し、スキャンコストを削減。
- エラー処理:
- ネットワークエラーやスロットリング(リクエスト制限)に備えてリトライロジックを実装。
これでDynamoDBのQuery操作に関する基本と応用が網羅されています。必要に応じてコピー&ペーストして活用してください!