问题内容
我在 dynamodb 中有一个使用以下命令创建的现有表
aws dynamodb create-table \
--region us-east-1 \
--table-name notifications \
--attribute-definitions AttributeName=CustomerId,AttributeType=S AttributeName=Timestamp,AttributeType=N AttributeName=MessageId,AttributeType=S \
--key-schema AttributeName=CustomerId,KeyType=HASH AttributeName=Timestamp,KeyType=RANGE \
--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
--global-secondary-indexes '[
{
"IndexName": "MessageId",
"KeySchema": [
{
"AttributeName": "MessageId",
"KeyType": "HASH"
}
],
"Projection": {
"ProjectionType": "ALL"
},
"ProvisionedThroughput": {
"ReadCapacityUnits": 5,
"WriteCapacityUnits": 5
}
}
]'
}
我想在它前面放置一个 API 包装器,它允许我从提供 CustomerId
的表中获取所有记录,因此我尝试使用来自 v2 GO SDK 的查询
// GET /notifications/
func (api NotificationsApi) getNotifications(w http.ResponseWriter, r *http.Request) {
var err error
customerId := r.URL.Query().Get("customerId")
if customerId == "" {
api.errorResponse(w, "customerId query parameter required", http.StatusBadRequest)
return
}
span, ctx := tracer.StartSpanFromContext(r.Context(), "notification.get")
defer span.Finish(tracer.WithError(err))
keyCond := expression.Key("CustomerId").Equal(expression.Value(":val"))
expr, err := expression.NewBuilder().WithKeyCondition(keyCond).Build()
input := &dynamodb.QueryInput{
TableName: aws.String("notifications"),
KeyConditionExpression: expr.KeyCondition(),
ExpressionAttributeValues: map[string]dynamodbTypes.AttributeValue{
":val": &dynamodbTypes.AttributeValueMemberS{Value: customerId},
},
}
fmt.Println(*expr.KeyCondition())
output, err := api.dynamoClient.Query(ctx, input)
fmt.Println(output)
fmt.Println(err)
}
但是,我从 dynamodb 得到了 400
operation error DynamoDB: Query, https response error StatusCode: 400, RequestID: *****, api error ValidationException: Invalid KeyConditionExpression: An expression attribute name used in the document path is not defined; attribute name: #0
fmt.PrintLn(*expr.KeyCondition())
的输出是 #0 = :0
在本地运行此查询会返回我的预期结果
awslocal dynamodb query \
--table-name notifications \
--key-condition-expression "CustomerId = :val" \
--expression-attribute-values '{":val":{"S":"localTesting"}}'
我也尝试过包含时间戳,但不认为这是必需的,因为我的终端命令没有它就可以工作。我认为我没有不当取消引用。我知道我的发电机会话是有效的,因为我可以发布到我的包装器并通过终端命令查看更新。
正确答案
以下是您可以用作模板的查询示例:
// TableBasics encapsulates the Amazon DynamoDB service actions used in the examples.
// It contains a DynamoDB service client that is used to act on the specified table.
type TableBasics struct {
DynamoDbClient *dynamodb.Client
TableName string
}
// Query gets all movies in the DynamoDB table that were released in the specified year.
// The function uses the `expression` package to build the key condition expression
// that is used in the query.
func (basics TableBasics) Query(releaseYear int) ([]Movie, error) {
var err error
var response *dynamodb.QueryOutput
var movies []Movie
keyEx := expression.Key("year").Equal(expression.Value(releaseYear))
expr, err := expression.NewBuilder().WithKeyCondition(keyEx).Build()
if err != nil {
log.Printf("Couldn't build expression for query. Here's why: %v\n", err)
} else {
response, err = basics.DynamoDbClient.Query(context.TODO(), &dynamodb.QueryInput{
TableName: aws.String(basics.TableName),
ExpressionAttributeNames: expr.Names(),
ExpressionAttributeValues: expr.Values(),
KeyConditionExpression: expr.KeyCondition(),
})
if err != nil {
log.Printf("Couldn't query for movies released in %v. Here's why: %v\n", releaseYear, err)
} else {
err = attributevalue.UnmarshalListOfMaps(response.Items, &movies)
if err != nil {
log.Printf("Couldn't unmarshal query response. Here's why: %v\n", err)
}
}
}
return movies, err
}
您可以查看更多 GoV2 示例 此处
以上就是如何使用 KeyConditionExpression 和 v2 Go SDK 查询 AWS DynamoDb?的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容猜你喜欢
AI推送时光机如何使用 AWS Go SDK 仅更新 DynamoDB 中的单个字段
后端开发2024-02-06
在 AWS EC2 上如何使用 Go SDK 自动化脚本执行?
后端开发2024-04-04
Go中如何使用MongoDB进行数据查询
后端开发2023-05-14
如何使用关键字和查询词查询Microsoft知识库
后端开发2023-09-12
如何使用Go语言实现高效的二维码生成和索引查询?
后端开发2023-07-03
Java 新手如何使用Spring MVC 中的查询字符串和查询参数
后端开发2024-01-21
SQLServer中如何使用分页查询和TOP关键字
后端开发2024-04-09
Jpa Specification如何实现and和or同时使用查询
后端开发2024-04-02
如何正确处理使用 Mux 的 Go 的可选查询参数?
后端开发2024-04-04
如何使用Jackson和JSON Pointer查询解析任何JSON节点
后端开发2024-04-02
使用spring data的page和pageable如何实现分页查询
后端开发2022-12-08
Bootstrap如何使用Table实现搜索框和查询功能
后端开发2024-04-02
mybatis如何使用Criteria的and和or进行联合查询
后端开发2024-04-02
Go语言库探秘:如何查找和使用可调用库
后端开发2024-04-04
如何使用Criteria进行分组求和、排序、模糊查询
后端开发2023-06-29
如何使用mysql条件查询and和or及其优先级
后端开发2024-04-02
如何使用SQL语句在MySQL中查询和筛选数据?
后端开发2023-12-17
咦!没有更多了?去看看其它编程学习网 内容吧