aws-sdk-go-v2
aws-sdk-go-v2 copied to clipboard
PageSize parameter for dynamodb.Client.Query
Describe the feature
The AWS CLI tool for DynamoDB allows specifying a page size (--page-size) which is the maximum number of matching items returned by the query. This is different from the limit option, which limits the number of items evaluated, including those which are not returned to the client.
dynamodb.QueryInput should export a PageSize property which, when set, limits the number of items returned to the caller, independent of the number of items evaluated.
Use Case
Pagination with DynamoDB in Go is currently very difficult. Here's an example function
func ListBooks(ctx context.Context, limit int, paginationToken string, paginationKey map[string]types.AttributeValue, client *dynamodb.Client) ([]User, map[string]types.AttributeValue, error) {
filterExpr := "#active = true"
result, err := client.Query(ctx, &dynamodb.QueryInput{
TableName: &tableName,
ExclusiveStartKey: paginationKey,
FilterExpression: &filterExpr,
ExpressionAttributeNames: map[string]string{
"#active": "active",
},
})
if err != nil {
return []User{}, nil, err
}
users := make([]User, len(result.Items))
err = attributevalue.UnmarshalListOfMaps(result.Items, &users)
return users, result.LastEvaluatedKey, err
}
I see no way to use the limit argument without either a) potentially returning more rows than the caller asked for, or b) limiting the returned rows by slicing them off myself and potentially missing them when the caller returns for the next page, because the LastEvaluatedKey returned by this query will be past the results I slice off.
Proposed Solution
A PageSize field should be added to the dynamodb.QueryInput struct, corresponding to the --page-size option used by the AWS CLI.
Other Information
No response
Acknowledgements
- [ ] I may be able to implement this feature request
- [ ] This feature might incur a breaking change
AWS Go SDK V2 Module Versions Used
github.com/aws/aws-sdk-go-v2/[email protected] github.com/aws/[email protected] github.com/aws/aws-sdk-go-v2/[email protected] github.com/aws/aws-sdk-go-v2/feature/ec2/[email protected] github.com/aws/aws-sdk-go-v2/[email protected] github.com/aws/aws-sdk-go-v2/service/[email protected] github.com/aws/aws-sdk-go-v2/[email protected] github.com/aws/aws-sdk-go-v2/service/[email protected] github.com/aws/aws-sdk-go-v2/[email protected] github.com/aws/[email protected] github.com/aws/aws-sdk-go-v2/[email protected] github.com/google/[email protected] github.com/aws/aws-sdk-go-v2/feature/ec2/[email protected] github.com/aws/[email protected] github.com/aws/aws-sdk-go-v2/feature/ec2/[email protected] github.com/aws/[email protected] github.com/aws/aws-sdk-go-v2/feature/ec2/[email protected] github.com/google/[email protected] github.com/aws/aws-sdk-go-v2/service/[email protected] github.com/aws/[email protected] github.com/aws/aws-sdk-go-v2/service/[email protected] github.com/aws/aws-sdk-go-v2/internal/[email protected] github.com/aws/aws-sdk-go-v2/service/[email protected] github.com/aws/aws-sdk-go-v2/internal/endpoints/[email protected] github.com/aws/aws-sdk-go-v2/service/[email protected] github.com/aws/[email protected] github.com/aws/aws-sdk-go-v2/service/[email protected] github.com/aws/[email protected] github.com/aws/aws-sdk-go-v2/service/[email protected] github.com/aws/aws-sdk-go-v2/internal/[email protected] github.com/aws/aws-sdk-go-v2/service/[email protected] github.com/aws/aws-sdk-go-v2/internal/endpoints/[email protected] github.com/aws/aws-sdk-go-v2/service/[email protected] github.com/aws/aws-sdk-go-v2/service/internal/[email protected]
Go version used
go version go1.18.1 linux/amd64
Would it be added soon?
Both the CLI and AWS SDK for Go work off the same underlying DynamoDB Query API
--page-size is mapped to Limit in the CLI:
> aws dynamodb query --table-name movies --key-condition-expression "#y = :v1" --expression-attribute-values '{":v1":{"N": "2013"}}' --expression-attribute-names "#y = year" --page-size 210 --debug
...
2023-02-21 11:48:41,078 - MainThread - botocore.endpoint - DEBUG - Making request for OperationModel(name=Query) with params: {'url_path': '/', 'query_string': '', 'method': 'P
OST', 'headers': {'X-Amz-Target': 'DynamoDB_20120810.Query', 'Content-Type': 'application/x-amz-json-1.0', 'User-Agent': 'aws-cli/2.9.21 Python/3.11.1 Darwin/22.3.0 source/x86_
64 prompt/off command/dynamodb.query'}, 'body': b'{"TableName": "movies", "KeyConditionExpression": "#y = :v1", "ExpressionAttributeNames": {"#y": "year"}, "ExpressionAttribute
Values": {":v1": {"N": "2013"}}, "Limit": 210}', 'url': 'https://dynamodb.us-west-2.amazonaws.com/', 'context': {'client_region': 'us-west-2', 'client_config': <botocore.config
.Config object at 0x110c53190>, 'has_streaming_input': False, 'auth_type': None}}
...
NOTE: The Limit: 210 in the request body that was mapped from the --page-size CLI argument.
I'd recommend using the provided Query paginator. DDB will never process more items than the Limit so the number of matching results will be <= the limit.
Closing.
⚠️COMMENT VISIBILITY WARNING⚠️
Comments on closed issues are hard for our team to see. If you need more assistance, please either tag a team member or open a new issue that references this one. If you wish to keep having a conversation with other community members under this issue feel free to do so.