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)其它相关文章!