DynamoDB Query in Go (AWS SDK v2)

Query liest jedes Item, das denselben Partitionsschlüssel teilt, und grenzt optional über den Sortierschlüssel ein. Im AWS SDK for Go v2 schreibst du eine KeyConditionExpression auf einem dynamodb.QueryInput, und der eingebaute QueryPaginator folgt LastEvaluatedKey über jede Ergebnisseite für dich.

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))
}

Erklärung

  • KeyConditionExpression — muss eine Gleichheit auf dem Partitionsschlüssel enthalten (#hashKey = :hashKeyValue) plus höchstens eine Sortierschlüssel-Bedingung (=, <, <=, >, >=, BETWEEN oder begins_with). Die Aliase #hashKey/#rangeKey lösen per ExpressionAttributeNames zu Artist/SongTitle auf (reservierte-Wort-sicher).
  • ExpressionAttributeValues — die :placeholder → typisierter-Wert-Map (&types.AttributeValueMemberS{...}).
  • Pagination — ein Query gibt höchstens 1 MB zurück. dynamodb.NewQueryPaginator umschließt den Client und ruft weiter auf, bis LastEvaluatedKey erschöpft ist; die HasMorePages() / NextPage(ctx)-Schleife ist das kanonische Muster des SDK.
  • Setze ScanIndexForward: aws.Bool(false), um die Sortierschlüssel-Reihenfolge umzukehren (aufsteigend ist der Standard).
  • Frage einen Sekundärindex ab, indem du IndexName: aws.String("...") hinzufügst.
  • Lieber Bedingungen im Code bauen? Das expression-Paket (github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression) setzt expression.Key(...).Equal(...)-Builder zusammen und generiert die Name-/Wert-Maps; attributevalue.UnmarshalListOfMaps verwandelt page.Items in Go-Structs.

Visuell erledigen

Der DynamoDB Expression Builder stellt die Schlüsselbedingung zusammen und kopiert lauffähigen Code, sodass du keine Platzhalter- und Wert-Maps von Hand schreiben musst.

Um Abfragen gegen echte Tabellen in einer GUI auszuführen — Schlüsselbedingungs-Formular, paginiertes Raster, Copy-as-Code — lade DynoTable herunter.

Verwandte Beispiele

References

Zuletzt verifiziert am 2026-07-13 gegen die oben verlinkte offizielle AWS-Dokumentation.

Diesen Request visuell bauen

Stelle diese Operation im kostenlosen DynamoDB Query Builder zusammen — Key-Bedingung, Filter, Index, Limit, Sortierreihenfolge und eine Paginierungsschleife — und kopiere sie als lauffähiges SDK-v3-, CLI- oder boto3-Programm zurück.

DynamoDB Query Builder öffnen

Mit DynamoDB ohne die Console arbeiten

DynoTable ist ein schneller Desktop-Client für DynamoDB — durchsuche Tabellen, führe SQL-artige Queries aus und bearbeite Items lokal.