首页 > 后端开发 > Golang > 正文

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

WBOY
发布: 2024-02-11 22:50:09
转载
794人浏览过

如何修复 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
    }
登录后复制

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

BRANDMARK
BRANDMARK

AI帮你设计Logo、图标、名片、模板……等

BRANDMARK 180
查看详情 BRANDMARK

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

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

解决方法

您需要将密码和 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("<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="aec2c6c0c0c9eecfc3cfd4c1c080cdc1c3">[email&#160;protected]</a>"),
                    },
                },
            },
        },
    })

    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("<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="4a262224242d0a2b272b30252464292527">[email&#160;protected]</a>"),
            },
        },
    })

    // 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 请求的错误?的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:stackoverflow网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号