DynamoDB Query en Go (AWS SDK v2)
Query lee todos los items que comparten una clave de partición, acotando opcionalmente por la clave de ordenación. En AWS SDK para Go v2 escribes un KeyConditionExpression sobre un dynamodb.QueryInput, y el QueryPaginator integrado sigue LastEvaluatedKey por ti a través de cada página de resultados.
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))
}Explicación
KeyConditionExpression— debe incluir una igualdad sobre la clave de partición (#hashKey = :hashKeyValue) más como máximo una condición de clave de ordenación (=,<,<=,>,>=,BETWEENobegins_with). Los alias#hashKey/#rangeKeyse resuelven aArtist/SongTitlemedianteExpressionAttributeNames(a salvo de palabras reservadas).ExpressionAttributeValues— el mapa:placeholder→ valor tipado (&types.AttributeValueMemberS{...}).- Paginación — un
Querydevuelve como máximo 1 MB.dynamodb.NewQueryPaginatorenvuelve el cliente y sigue llamando hasta agotarLastEvaluatedKey; el bucleHasMorePages()/NextPage(ctx)es el patrón canónico del SDK. - Pon
ScanIndexForward: aws.Bool(false)para invertir el orden de la clave de ordenación (el ascendente es el valor por defecto). - Consulta un índice secundario añadiendo
IndexName: aws.String("..."). - ¿Prefieres construir las condiciones en código? El paquete
expression(github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression) compone buildersexpression.Key(...).Equal(...)y genera los mapas de nombres/valores;attributevalue.UnmarshalListOfMapsconviertepage.Itemsen structs de Go.
Hazlo visualmente
El DynamoDB Expression Builder monta la condición de clave y copia código ejecutable, así no escribes a mano los mapas de marcadores y valores.
Para ejecutar consultas contra tablas reales en una interfaz gráfica — formulario de condición de clave, cuadrícula paginada, copiar como código — descarga DynoTable.
Ejemplos relacionados
- DynamoDB Query en Java — la misma consulta con AWS SDK para Java 2.x.
- DynamoDB Scan en Go — cuando no puedes entrar por clave en una partición.
- Query vs. Scan — por qué
Queryes el valor por defecto correcto. - Expresiones de condición de clave — cada operador legal de clave de partición/ordenación.
- "Query condition missed key schema element" — la condición de clave nombra el atributo incorrecto u omite la clave de partición.
- "Query key condition not supported" — un operador que la condición de clave no puede usar, como contains o una segunda condición de clave de ordenación.
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
Verificado por última vez el 2026-07-13 contra la documentación oficial de AWS enlazada arriba.