如何修复 Query dynamodb 请求的错误?

2024年 2月 12日 27.3k 0

如何修复 query dynamodb 请求的错误?

php小编鱼仔为您呈现:如何修复Query dynamodb请求的错误?DynamoDB是亚马逊提供的一种高度可扩展的NoSQL数据库服务。在使用DynamoDB进行查询时,可能会遇到各种错误,影响系统的正常运行。要修复这些错误,首先需要仔细检查查询语句的正确性,并确保提供的参数和表结构匹配。另外,还可以通过增加Read Capacity来提高查询性能,使用合适的索引来优化查询速度。此外,了解并遵循DynamoDB的最佳实践,如合理使用批量操作和条件表达式等,也能有效避免查询错误。通过以上方法,您可以轻松修复和优化DynamoDB查询中的错误,提高系统的稳定性和性能。

问题内容

在 dynamodb 中,我有一个表,其中包含:

- email (primary key)
- password (attribute)
- rname (attribute)

登录后复制

我正在使用 aws go sdk v1 来实现仅使用数据库主键执行查询:

我要解组的结构是:

type item struct {
email string `json:"email"`
password string `json:"password"`
rname string `json:"rname"`
}

登录后复制

和代码:

result, err := client.Query(&dynamodb.QueryInput{
TableName: aws.String("accountsTable"),
KeyConditions: map[string]*dynamodb.Condition{
"email": {
ComparisonOperator: aws.String("EQ"),
AttributeValueList: []*dynamodb.AttributeValue{
{
S: aws.String(email),
},
},
},
},
})
if err != nil {
return false, err
}

item := []Item{}

err = dynamodbattribute.UnmarshalListOfMaps(result.Items, &item)
if err != nil {
return false, err
}

登录后复制

但是,我收到密钥无效的问题。我检查数据库中的密钥,它也与我打印到控制台的密钥相匹配。

不知道如何解决这个问题,因为我看到的示例似乎适用于他们的并且看起来相同。

任何解决此问题的帮助将不胜感激:)

解决方法

您需要将密码和 rname 的值设置为 omitempty,以便它不会设置为空值,因为它们不是键,它们不应包含在查询中,因为它会引发无效键异常:

type item struct {
email string `json:"email" dynamodbav:"email,omitempty"`
password string `json:"password" dynamodbav:"password,omitempty"`
rname string `json:"rname" dynamodbav:"rname,omitempty"`
}

登录后复制

更新

我认为问题是由于您尝试将整个响应编组到单个命令中,但是,迭代对我有用。 (我不使用 go)。

package main
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/dynamodb"
"github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute"

"fmt"
)

func main() {

// create session
sess := session.must(session.newsessionwithoptions(session.options{
sharedconfigstate: session.sharedconfigenable,
}))

// create dynamodb client with logging
client := dynamodb.new(sess, aws.newconfig())

type item struct {
email string `dynamodbav: "email"`
password string `dynamodbav: "password,omitempty"`
rname string `dynamodbav: "rname,omitempty"`
}

result, err := client.query(&dynamodb.queryinput{
tablename: aws.string("accountstable"),
keyconditions: map[string]*dynamodb.condition{
"email": {
comparisonoperator: aws.string("eq"),
attributevaluelist: []*dynamodb.attributevalue{
{
s: aws.string("[email protected]"),
},
},
},
},
})

if err != nil {
fmt.println("query api call failed:")
fmt.println((err.error()))
}

for _, i := range result.items {

item := item{}
err = dynamodbattribute.unmarshalmap(i, &item)

if err != nil {
fmt.println("got error unmarshalling: %s", err)
}

fmt.println("email: ", item.email)
fmt.println()

}
}

登录后复制

此外,当您使用 email 的单个密钥时,这意味着最多有 1 个项目具有相同的电子邮件地址,这意味着您应该使用 getitem 而不是 query

package main

import (
"fmt"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/dynamodb"
"github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute"
)

func main() {

// Item to Get
type Item struct {
Email string `dynamodbav: "email"`
Password string `dynamodbav: "password,omitempty"`
Rname string `dynamodbav: "rname,omitempty"`
}

// Create Session
sess := session.Must(session.NewSessionWithOptions(session.Options{
SharedConfigState: session.SharedConfigEnable,
}))

// Create DynamoDB Client
client := dynamodb.New(sess, aws.NewConfig())

// Get Item
result, err := client.GetItem(&dynamodb.GetItemInput{
TableName: aws.String("accountsTable"),
Key: map[string]*dynamodb.AttributeValue{
"email": {
S: aws.String("[email protected]"),
},
},
})

// Catch Error
if err != nil {
fmt.Println("GetItem API call failed:")
fmt.Println((err.Error()))
}

item := Item{}

// Unmarhsall
err = dynamodbattribute.UnmarshalMap(result.Item, &item)

if err != nil {
panic(fmt.Sprintf("Failed to unmarshal Record, %v", err))
}

// If Item Returns Empty
if item.Email == "" {
fmt.Println("Could not find Item")
return
}

// Print Result
fmt.Println("Found item:")
fmt.Println("Email: ", item.Email)

}

登录后复制

以上就是如何修复 Query dynamodb 请求的错误?的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论