GetItem DynamoDB in Go (AWS SDK v2)
In AWS SDK for Go v2 un item è una map[string]types.AttributeValue, e types.AttributeValue è un'interfaccia sigillata: le uniche implementazioni sono le dieci struct AttributeValueMember* che l'SDK fornisce. Scrivere una chiave con esse è facile. Rileggere i valori è il punto in cui Go diverge da ogni altro SDK.
client.GetItem vuole comunque la chiave primaria completa, come ovunque.
Codice
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)
out, err := client.GetItem(ctx, &dynamodb.GetItemInput{
TableName: aws.String("Music"),
Key: map[string]types.AttributeValue{
"Artist": &types.AttributeValueMemberS{Value: "Arturo Sandoval"},
"SongTitle": &types.AttributeValueMemberS{Value: "Cubano Chant"},
},
ProjectionExpression: aws.String("#proj0, #proj1, #proj2, #proj3"),
ExpressionAttributeNames: map[string]string{
"#proj0": "Artist",
"#proj1": "SongTitle",
"#proj2": "AlbumTitle",
"#proj3": "Year",
},
})
if err != nil {
log.Fatalf("get item: %v", err)
}
if out.Item == nil {
fmt.Println("Item not found")
return
}
fmt.Println(out.Item)
}Spiegazione
- Gli scalari sono puntatori —
TableName,ProjectionExpressioneConsistentReadsono*stringe*boolcosì l'SDK può distinguere "non impostato" dal valore zero.aws.String,aws.Booleaws.Int32esistono per questo e per nient'altro. - I numeri arrivano come stringhe —
AttributeValueMemberN.Valueè unastring, perché DynamoDB invia i numeri come stringhe sul filo. LeggereYearsignificaout.Item["Year"].(*types.AttributeValueMemberN)e poistrconv.Atoi. Usa la forma comma-ok dell'asserzione; la forma nuda va in panic quando l'attributo manca o è di un altro tipo. attributevalue.UnmarshalMapè la via d'uscita — dagithub.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue, mappa l'intero item su una struct con i tagdynamodbave fa la conversione stringa-numero. Vale la pena ricorrervi nel momento in cui un item ha più di un paio di attributi.out.Itemènilquando non c'è nulla, e ancheerrènil.len(out.Item) == 0copre sia nil che vuoto se non hai bisogno di distinguerli.- Confronta gli errori con
errors.As— Go v2 avvolge i fault del servizio in un operation error Smithy, quindi siaerr == …sia il confronto di stringhe suerr.Error()falliscono silenziosamente. Dichiaravar nf *types.ResourceNotFoundExceptione passa il suo indirizzo. ConsistentRead: aws.Bool(true)raddoppia il costo di lettura ed è rifiutato su un GSI. Nemmeno gli alias#projqui sopra sono decorazione:Yearè una parola riservata, e una proiezione che la nomina direttamente viene rifiutata.
Fallo visivamente
Tradurre tra la forma AttributeValueMember* e il JSON normale è una tassa costante in Go. Il convertitore DynamoDB JSON fa quel viaggio di andata e ritorno nel browser quando devi solo leggere o incollare un item.
DynoTable mostra invece gli item come normali righe, ed esporta la query dietro la griglia come un programma Go costruito su questi stessi tipi dell'SDK v2. Scarica DynoTable.
Esempi correlati
- DynamoDB GetItem in Java — la stessa lettura con AWS SDK for Java 2.x.
- DynamoDB Query in Go — leggi un'intera partizione invece di un solo item.
- Come funzionano le chiavi di partizione di DynamoDB — perché
GetItemha bisogno della chiave completa. - DynamoDB ResourceNotFoundException — di solito il primo errore qui: nome tabella o regione sbagliati.
- "The provided key element does not match the schema" — la chiave che passi non corrisponde allo schema di chiave della tabella.
Riferimenti
- GetItem — Amazon DynamoDB API Reference
- Use GetItem with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- dynamodb package — AWS SDK for Go v2 (pkg.go.dev)
- dynamodb/types package — AWS SDK for Go v2 (pkg.go.dev)
- attributevalue package — AWS SDK for Go v2 (pkg.go.dev)
- Read consistency — Amazon DynamoDB Developer Guide
Ultima verifica 2026-07-28 rispetto alla documentazione ufficiale AWS collegata sopra.