返回顶部
首页 > 资讯 > 精选 >如何使用 KeyConditionExpression 和 v2 Go SDK 查询 AWS DynamoDb?
  • 815
分享到

如何使用 KeyConditionExpression 和 v2 Go SDK 查询 AWS DynamoDb?

2024-02-08 20:02:59 815人浏览 八月长安
摘要

问题内容 我在 dynamodb 中有一个使用以下命令创建的现有表 aws dynamodb create-table \ --region us-east-1 \ --tab

问题内容

我在 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?的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 如何使用 KeyConditionExpression 和 v2 Go SDK 查询 AWS DynamoDb?

本文链接: https://lsjlt.com/news/562018.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何使用 KeyConditionExpression 和 v2 Go SDK 查询 AWS DynamoDb?
    问题内容 我在 dynamodb 中有一个使用以下命令创建的现有表 aws dynamodb create-table \ --region us-east-1 \ --tab...
    99+
    2024-02-08
  • AWS Golang SDK v2 - 如何向 Go AWS 脚本添加函数
    php小编苹果为您带来了关于AWS Golang SDK v2的介绍。如果您正在使用Go语言编写AWS脚本,您可能想要向脚本中添加一些自定义的函数以增强其功能。本文将向您展示如何使用A...
    99+
    2024-02-09
    go语言
  • 如何使用 AWS Go SDK 仅更新 DynamoDB 中的单个字段
    问题内容 希望有人能够阐明我一直在努力解决的这个问题。 我在 dynamo 中有这个表,我们称之为 people ,在这个表中,我有 id 的属性作为我们的分区键、name、lastn...
    99+
    2024-02-06
  • 如何使用 AWS sdk 在 Go 中正确解组 PartiQL 查询的结果?
    问题内容 我的乐队即将演出的节目存储在 DynamoDB 中,并且我有以下代码: type PartiQLRunner struct { DynamoDbClient *dyn...
    99+
    2024-02-12
  • 如何使用 Go SDK 设置 DynamoDB requestTimeout 作为默认重试器?
    小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《如何使用 Go SDK 设置 DynamoDB requestTimeout 作为默认重试器?》,就很适合你,本篇文章讲...
    99+
    2024-04-05
  • 在 AWS EC2 上如何使用 Go SDK 自动化脚本执行?
    怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面编程网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《在 AWS EC2 上如何使用 G...
    99+
    2024-04-04
  • Go中如何使用MongoDB进行数据查询
    Go是一种开源编程语言,被许多开发人员广泛使用。在与MongoDB数据库进行交互时,Go在编写高效和简洁查询时的表现也非常出色。本文将介绍如何在Go中使用MongoDB进行查询。首先,我们需要安装“mgo” Go-MongoDB驱动程序,可...
    99+
    2023-05-14
  • 创建 Azure AD 用户时如何使用 GO SDK?
    从现在开始,努力学习吧!本文《创建 Azure AD 用户时如何使用 GO SDK?》主要讲解了等等相关知识点,我会在编程网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下...
    99+
    2024-04-05
  • 如何使用 Gorilla Websockets 和 alexedwards/scs/v2 实现 http.Hijacker
    php小编苹果今天为大家介绍一种使用Gorilla Websockets和alexedwards/scs/v2库来实现http.Hijacker的方法。这种方法可以帮助开发者在自己的应...
    99+
    2024-02-10
  • 如何使用关键字和查询词查询Microsoft知识库
    如果您想使用关键字和查询词查询Microsoft知识库,可以按照以下步骤进行操作:1. 打开您的浏览器并进入Microsoft官方网...
    99+
    2023-09-12
    Microsoft
  • 如何使用LINQ查询
    这篇文章主要介绍了如何使用LINQ查询,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。.NET Language Integrated Query (LINQ):采用通用方案来...
    99+
    2023-06-17
  • LINQ查询如何使用
    这篇文章主要讲解了“LINQ查询如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“LINQ查询如何使用”吧!LINQ查询成为了.NET中头等的编程概念,被查询的数据可以是XML(LINQ...
    99+
    2023-06-17
  • MySQL如何在查询中使用子查询
    MySQL中可以在查询中使用子查询来实现更复杂的查询逻辑。子查询是一个嵌套在主查询中的查询语句,通常用于获取主查询中某些条件的结果,...
    99+
    2024-03-06
    MySQL
  • 如何使用 go-sdk 将指标推送到 Opentelemetry
    php小编西瓜为您介绍如何使用go-sdk将指标推送到Opentelemetry。Opentelemetry是一个开源的观测框架,可以帮助开发人员收集和分析应用程序的指标数据。使用go...
    99+
    2024-02-09
    回流
  • 如何使用mysql连接查询、联合查询、子查询
    这篇文章主要讲解了如何使用mysql连接查询、联合查询、子查询,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。连接查询:连接查询就是将多个表联合起来查询,连接查询方式有内连接、外...
    99+
    2024-04-02
  • 如何使用 AWS SDK 更改 EC2 启动模板中的实例类型?
    问题内容 我希望更改启动模板中的某些内容,例如实例类型。这意味着在这样做的同时创建一个新版本。 我已经浏览了 Go 和 Python 的 SDK 文档。似乎都没有让我实现相同目标的参数...
    99+
    2024-02-06
  • 如何使用 Azure Event Hubs Go SDK (azeventhubs) 使用最新事件?
    php小编草莓为大家带来了一篇关于如何使用Azure Event Hubs Go SDK (azeventhubs)使用最新事件的指南。Azure Event Hubs是一种高可扩展、...
    99+
    2024-02-09
  • 如何使用update 子查询
    本篇文章给大家分享的是有关如何使用update 子查询,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1, 关联子查询和非关联子查询在...
    99+
    2024-04-02
  • mysql如何使用in查询
    这篇文章主要为大家展示了“mysql如何使用in查询”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql如何使用in查询”这篇文章吧。 ...
    99+
    2024-04-02
  • 如何使用MySQL查询语句
    这篇文章主要讲解了“如何使用MySQL查询语句”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用MySQL查询语句”吧!查询数据如下 or查询...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作