如何使用分页列出 table 中的所有项目

How to list all the items in a table with pagination

我正在尝试使用分页列出 DynamoDB table 中的所有项目,下面是我的尝试:

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呢?还有其他方法或解决方法吗?

刚刚将 QueryInput 替换为 ScanInput,将 QueryPaginator 替换为 ScanPaginator

Query 确实需要您的钥匙。它旨在在您的 DynamoDB 中查找 specific 项。要在 DynamoDB 中获取 all 项,您需要使用 Scan 操作。

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

而不是 QueryInput 使用 ScanInput and instead of NewQueryPaginator use NewScanPaginator.