Go (AWS SDK v2) での DynamoDB Query
Query は1つのパーティションキーを共有するすべてのアイテムを読み取り、任意でソートキーによって絞り込みます。AWS SDK for Go v2 では、dynamodb.QueryInput に KeyConditionExpression を書き、組み込みの QueryPaginator がすべての結果ページにわたって LastEvaluatedKey を代わりに追跡します。
Code
package main
import (
"context"
"fmt"
"log"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
)
func main() {
ctx := context.TODO()
cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion("us-east-1"))
if err != nil {
log.Fatalf("load config: %v", err)
}
client := dynamodb.NewFromConfig(cfg)
paginator := dynamodb.NewQueryPaginator(client, &dynamodb.QueryInput{
TableName: aws.String("Music"),
KeyConditionExpression: aws.String(
"#hashKey = :hashKeyValue AND begins_with(#rangeKey, :rangeKeyValue)"),
ExpressionAttributeNames: map[string]string{
"#hashKey": "Artist",
"#rangeKey": "SongTitle",
},
ExpressionAttributeValues: map[string]types.AttributeValue{
":hashKeyValue": &types.AttributeValueMemberS{Value: "Arturo Sandoval"},
":rangeKeyValue": &types.AttributeValueMemberS{Value: "C"},
},
})
var items []map[string]types.AttributeValue
for paginator.HasMorePages() {
page, err := paginator.NextPage(ctx)
if err != nil {
log.Fatalf("query: %v", err)
}
items = append(items, page.Items...)
}
fmt.Printf("Found %d items\n", len(items))
}Explanation
KeyConditionExpression— パーティションキーに対する等価(#hashKey = :hashKeyValue)に加え、最大1つのソートキー条件(=、<、<=、>、>=、BETWEEN、またはbegins_with)を含める必要があります。#hashKey/#rangeKeyエイリアスはExpressionAttributeNamesを介してArtist/SongTitleに解決されます(予約語に安全)。ExpressionAttributeValues—:placeholder→ 型付き値のマップ(&types.AttributeValueMemberS{...})。- ページネーション — 1回の
Queryは最大 1 MB を返します。dynamodb.NewQueryPaginatorはクライアントをラップし、LastEvaluatedKeyが尽きるまで呼び出しを続けます。HasMorePages()/NextPage(ctx)のループは SDK の標準的なパターンです。 - ソートキーの順序を逆にするには
ScanIndexForward: aws.Bool(false)を設定します(デフォルトは昇順)。 - セカンダリインデックスをクエリするには
IndexName: aws.String("...")を追加します。 - コードで条件を構築したいですか?
expressionパッケージ(github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression)はexpression.Key(...).Equal(...)ビルダーを組み立て、名前/値のマップを生成します。attributevalue.UnmarshalListOfMapsはpage.Itemsを Go の構造体に変換します。
Do it visually
DynamoDB Expression Builder はキー条件を組み立て、実行可能なコードをコピーするので、プレースホルダーと値のマップを手書きする必要はありません。
GUI で実際のテーブルに対してクエリを実行するには(キー条件フォーム、ページネーションされたグリッド、コードとしてコピー)、DynoTable をダウンロードしてください。
Related examples
- DynamoDB Query in Java — AWS SDK for Java 2.x による同じクエリ。
- DynamoDB Scan in Go — パーティションにキーで入れないとき。
- Query vs. Scan — なぜ
Queryが適切なデフォルトなのか。 - Key condition expressions — すべての有効なパーティション/ソートキー演算子。
- "Query condition missed key schema element" — キー条件が誤った属性を指定するか、パーティションキーを省いている。
- "Query key condition not supported" — contains や2つ目のソートキー条件のような、キー条件が使えない演算子。
References
- Query — Amazon DynamoDB API Reference
- Use Query with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- dynamodb package — AWS SDK for Go v2 (pkg.go.dev)
- expression package — AWS SDK for Go v2 (pkg.go.dev)
- Querying tables — Amazon DynamoDB Developer Guide
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。