DynamoDB Query en Go (AWS SDK v2)
Query lit chaque élément qui partage une clé de partition, en restreignant éventuellement par la clé de tri. Dans l'AWS SDK for Go v2 tu écris un KeyConditionExpression sur un dynamodb.QueryInput, et le QueryPaginator intégré suit LastEvaluatedKey à travers chaque page de résultats pour toi.
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))
}Explication
KeyConditionExpression— doit inclure une égalité sur la clé de partition (#hashKey = :hashKeyValue) plus au plus une condition de clé de tri (=,<,<=,>,>=,BETWEEN, oubegins_with). Les alias#hashKey/#rangeKeyse résolvent enArtist/SongTitleviaExpressionAttributeNames(à l'abri des mots réservés).ExpressionAttributeValues— la carte:placeholder→ valeur typée (&types.AttributeValueMemberS{...}).- Pagination — un
Queryrenvoie au plus 1 Mo.dynamodb.NewQueryPaginatorenveloppe le client et continue d'appeler jusqu'à épuisement deLastEvaluatedKey; la boucleHasMorePages()/NextPage(ctx)est le motif canonique du SDK. - Définis
ScanIndexForward: aws.Bool(false)pour inverser l'ordre de la clé de tri (l'ordre croissant est celui par défaut). - Interroge un index secondaire en ajoutant
IndexName: aws.String("..."). - Tu préfères construire les conditions en code ? Le package
expression(github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression) compose des buildersexpression.Key(...).Equal(...)et génère les cartes de noms/valeurs ;attributevalue.UnmarshalListOfMapstransformepage.Itemsen structures Go.
À faire visuellement
Le DynamoDB Expression Builder assemble la condition de clé et copie du code exécutable, pour que tu n'écrives pas à la main les cartes de placeholders et de valeurs.
Pour exécuter des requêtes sur de vraies tables dans une interface graphique — formulaire de condition de clé, grille paginée, copie en tant que code — télécharge DynoTable.
Exemples liés
- DynamoDB Query en Java — la même requête avec l'AWS SDK for Java 2.x.
- DynamoDB Scan en Go — quand tu ne peux pas cibler une partition par clé.
- Query vs. Scan — pourquoi
Queryest le bon choix par défaut. - Expressions de condition de clé — chaque opérateur de clé de partition/tri légal.
- "Query condition missed key schema element" — la condition de clé nomme le mauvais attribut ou saute la clé de partition.
- "Query key condition not supported" — un opérateur que la condition de clé ne peut pas utiliser, comme contains ou une deuxième condition de clé de tri.
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
Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.