在 Go(AWS SDK v2)中使用 DynamoDB Query

Query 讀取共用同一個 partition key 的每一個項目,並可選擇以 sort key 縮小範圍。在 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))
}

說明

  • KeyConditionExpression — 必須包含對 partition key 的相等條件(#hashKey = :hashKeyValue),加上至多一個 sort-key 條件(=<<=>>=BETWEENbegins_with)。#hashKey/#rangeKey 別名透過 ExpressionAttributeNames 解析為 Artist/SongTitle(保留字安全)。
  • ExpressionAttributeValues:placeholder → 帶型別值的 map(&types.AttributeValueMemberS{...})。
  • 分頁 — 單次 Query 最多回傳 1 MB。dynamodb.NewQueryPaginator 包裝 client,並持續呼叫直到 LastEvaluatedKey 耗盡;HasMorePages() / NextPage(ctx) 迴圈是 SDK 的標準模式。
  • 設定 ScanIndexForward: aws.Bool(false) 可反轉 sort-key 順序(預設為遞增)。
  • 加上 IndexName: aws.String("...") 可查詢 secondary index。
  • 偏好在程式碼中建立條件?expression 套件github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression)會組合 expression.Key(...).Equal(...) builder 並產生 name/value map;attributevalue.UnmarshalListOfMaps 會把 page.Items 轉成 Go struct。

改用視覺化操作

DynamoDB Expression Builder 會組裝 key condition 並複製可執行的程式碼,讓你不用手寫 placeholder 與 value map。

想在 GUI 中對實際表格執行查詢 — key-condition 表單、分頁格線、複製為程式碼 — 下載 DynoTable

相關範例

References

最後驗證於 2026-07-13,對照上方連結的 AWS 官方文件。

以視覺化方式建構此請求

在免費的 DynamoDB 查詢建構器中組合此操作 — 鍵條件、Filter、Index、Limit、排序方向與分頁迴圈 — 再把它複製成可執行的 SDK v3、CLI 或 boto3 程式。

開啟 DynamoDB 查詢建構器

不必透過主控台就能操作 DynamoDB

DynoTable 是一款快速的 DynamoDB 桌面用戶端 — 瀏覽表格、執行 SQL 風格的查詢,並在本機編輯項目。