DynamoDB Scan em Go (AWS SDK v2)
Scan lê todos os itens de uma tabela ou índice, página por página, e então opcionalmente descarta linhas com uma FilterExpression. No AWS SDK for Go v2 o ScanPaginator embutido segue o LastEvaluatedKey até a tabela inteira ser lida.
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.NewScanPaginator(client, &dynamodb.ScanInput{
TableName: aws.String("Music"),
FilterExpression: aws.String("#filter0 >= :filterValue0"),
ExpressionAttributeNames: map[string]string{
"#filter0": "Year",
},
ExpressionAttributeValues: map[string]types.AttributeValue{
":filterValue0": &types.AttributeValueMemberN{Value: "2010"},
},
})
var items []map[string]types.AttributeValue
for paginator.HasMorePages() {
page, err := paginator.NextPage(ctx)
if err != nil {
log.Fatalf("scan: %v", err)
}
items = append(items, page.Items...)
}
fmt.Printf("Matched %d items\n", len(items))
}Explicação
FilterExpression— aplicada depois da leitura, no servidor. Ela encolhe a resposta mas não o custo: você paga para ler cada item varrido, filtrado ou não.ExpressionAttributeNames— o atributo filtrado recebe um alias (#filter0→Year), o que mantém palavras reservadas comoYearseguras.- Paginação — cada página do
Scanlê no máximo 1 MB antes de filtrar, então uma página filtrada pode voltar vazia enquanto a tabela ainda tem correspondências.dynamodb.NewScanPaginatorcontinua chamando até oLastEvaluatedKeyse esgotar — nunca pare na primeira página. - Defina
Limitpara limitar itens varridos por página (pré-filtro) — ele não limita os itens retornados. - Para um scan grande de tabela inteira, divida o trabalho entre goroutines com
Segment/TotalSegments(um parallel scan). - Prefira
Query.Scanlê a tabela inteira; em qualquer coisa que não seja uma tabela minúscula, é lento e caro.
Faça visualmente
Montando um filtro na mão? O DynamoDB Expression Builder constrói a FilterExpression + mapas de nome/valor e copia código executável.
Para explorar tabelas numa GUI — com grades de resultados filtradas e paginadas e copiar como código — baixe o DynoTable, em vez de fazer scan às cegas a partir de um script.
Exemplos relacionados
- DynamoDB Scan em Java — o mesmo scan com o AWS SDK for Java 2.x.
- DynamoDB Query em Go — a leitura mais barata que você geralmente deveria usar.
- Query vs. Scan — quando (raramente) um
Scanse justifica. - Por que meu DynamoDB Scan é lento e caro? — o modelo de custo e como evitá-lo.
- DynamoDB ProvisionedThroughputExceededException — o que um scan de tabela inteira faz à capacidade de uma tabela provisionada.
- DynamoDB ThrottlingException — o outro throttle, e como o backoff exponencial lida com ele.
References
- Scan — Amazon DynamoDB API Reference
- Use Scan 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)
- Scanning tables — Amazon DynamoDB Developer Guide
Última verificação em 2026-07-13 contra a documentação oficial da AWS vinculada acima.