Python (boto3) での DynamoDB GSI のクエリ
グローバルセカンダリインデックスのクエリは、通常の query にパラメーターを1つ加えたものです: IndexName。キー条件はテーブルのキーではなくインデックスのキーを対象とします。ここでは AlbumTitle-index によってアルバムで曲を取得できます。これは、ベーステーブル(Artist + SongTitle)ではスキャンなしには対応できないアクセスパターンです。
Code
import boto3
client = boto3.client("dynamodb")
paginator = client.get_paginator("query")
items = []
for page in paginator.paginate(
TableName="Music",
IndexName="AlbumTitle-index",
KeyConditionExpression="#hashKey = :hashKeyValue",
ExpressionAttributeNames={"#hashKey": "AlbumTitle"},
ExpressionAttributeValues={":hashKeyValue": {"S": "Danzon"}},
):
items.extend(page["Items"])
print(f"Found {len(items)} songs on the album")Explanation
IndexName— クエリする GSI を指定します(TableNameは依然として必須)。KeyConditionExpressionはインデックスのパーティション(および任意でソート)キー — ここではAlbumTitle— を、テーブルクエリと同じ演算子で使います。- 結果整合性のみ — GSI はベーステーブルから非同期にレプリケーションされます。GSI クエリで
ConsistentRead=Trueを渡してもアップグレードされず、ValidationExceptionを発生させます。(ローカルセカンダリインデックスは強い整合性をサポートします。) - 投影された属性のみ取得できる — GSI クエリはインデックスが投影するもの(
ALL、KEYS_ONLY、またはINCLUDEで列挙された属性)を返し、残りをベーステーブルから取得することはできません。投影されていない属性が必要ですか?テーブルキーに対するget_itemで追跡するか、投影を広げましょう。 - GSI ではキーは一意ではない — 多くのアイテムが同じインデックスキーを共有でき、インデックスキー属性を持たないアイテムは単に現れません(これがスパースインデックスのパターンです)。
- ページネーション —
client.get_paginator("query")は、テーブルクエリとまったく同じように各ページでLastEvaluatedKeyを追跡します。各pageはItemsリストを持ちます。 - リソースAPI では、同じクエリはネイティブな Python 値を使った
table.query(IndexName="AlbumTitle-index", KeyConditionExpression=Key("AlbumTitle").eq("Danzon"))です。
Do it visually
DynamoDB Expression Builder はインデックスクエリのためにキー条件 + 名前/値のマップを構築し、実行可能な boto3 コードをコピーします。
テーブルのインデックスを参照し、フォームから GSI クエリを実行するには(ページネーションされたグリッド、コードとしてコピー)、DynoTable をダウンロードしてください。
Related examples
- DynamoDB Query a GSI in Node.js — AWS SDK v3 による同じインデックスクエリ。
- DynamoDB Query a GSI with the AWS CLI — シェルからの同じインデックスクエリ。
- DynamoDB Query in Python — ベーステーブルのクエリ。
- GSI vs. LSI — アクセスパターンに合うインデックスの種類。
- Why GSIs are eventually consistent — レプリケーション遅延の解説。
- "The table does not have the specified index" — インデックス名が一致しない(GSI 名は大文字小文字を区別します)。
- "Consistent reads are not supported on global secondary indexes" — なぜ consistent-read フラグが GSI で失敗するのか。
References
- Query — Amazon DynamoDB API Reference
- DynamoDB.Paginator.Query — Boto3 documentation
- Using Global Secondary Indexes in DynamoDB — Amazon DynamoDB Developer Guide
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。