如何用分页方式列出表中的所有项目



我试图用分页的方式列出DynamoDB表中的所有项目,下面是我的尝试:

const tableName = "RecordingTable"
type Recording struct {
ID string `dynamodbav:"id"`
CreatedAt string `dynamodbav:"createdAt"`
UpdatedAt string `dynamodbav:"updatedAt"`
Duration int `dynamodbav:"duration"`
}
type RecordingRepository struct {
ctx context.Context
svc *dynamodb.Client
}
func NewRecordingRepository(ctx context.Context) (*RecordingRepository, error) {
cfg, err := config.LoadDefaultConfig(ctx)
if err != nil {
return nil, err
}
return &RecordingRepository{ctx, dynamodb.NewFromConfig(cfg)}, nil
}
func (r *RecordingRepository) List(page int, size int) ([]Recording, error) {
size32 := int32(size)
queryInput := &dynamodb.QueryInput{
TableName: aws.String(tableName),
Limit:     &size32,
}
recordings := []Recording{}
queryPaginator := dynamodb.NewQueryPaginator(r.svc, queryInput)
for i := 0; queryPaginator.HasMorePages(); i++ {
result, err := queryPaginator.NextPage(r.ctx)
if err != nil {
return nil, err
}
if i == page {
if result.Count > 0 {
for _, v := range result.Items {
recording := Recording{}
if err := attributevalue.UnmarshalMap(v, &recording); err != nil {
return nil, err
}
recordings = append(recordings, recording)
}
}
break
}
}
return recordings, nil
}

当我运行上面的代码时,我得到以下错误消息:

api error ValidationException: Either the KeyConditions or KeyConditionExpression parameter must be specified in the request.

但是,当我想要获取所有项目时,为什么要指定KeyConditionExpression?有其他方法或解决方法吗?

Query确实需要您的密钥。它的目的是在DynamoDB中查找特定的项目。要获取DynamoDB中的所有项,需要使用Scan操作。

这应该很容易在代码中修复。

使用ScanInput代替QueryInput,使用NewScanPaginator代替NewQueryPaginator

刚刚用ScanInput替换QueryInput,用ScanPaginator替换QueryPaginator

最新更新