我试图用分页的方式列出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
。