Go (AWS SDK v2) での DynamoDB Query

Query は1つのパーティションキーを共有するすべてのアイテムを読み取り、任意でソートキーによって絞り込みます。AWS SDK for Go v2 では、dynamodb.QueryInputKeyConditionExpression を書き、組み込みの 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.UnmarshalListOfMapspage.Items を Go の構造体に変換します。

Do it visually

DynamoDB Expression Builder はキー条件を組み立て、実行可能なコードをコピーするので、プレースホルダーと値のマップを手書きする必要はありません。

GUI で実際のテーブルに対してクエリを実行するには(キー条件フォーム、ページネーションされたグリッド、コードとしてコピー)、DynoTable をダウンロードしてください。

References

最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

このリクエストをビジュアルに組み立てる

この操作を無料の DynamoDB クエリビルダーで組み立て — キー条件、フィルタ、インデックス、Limit、ソート順、ページネーションループ — 実行可能な SDK v3・CLI・boto3 のプログラムとしてコピーして戻れます。

DynamoDB クエリビルダーを開く

Console なしで DynamoDB を扱う

DynoTable は DynamoDB 向けの高速なデスクトップクライアントです — テーブルを閲覧し、SQL スタイルのクエリを実行し、アイテムをローカルで編集できます。