返回顶部
首页 > 资讯 > 精选 >如何使用 AWS Go SDK 仅更新 DynamoDB 中的单个字段
  • 533
分享到

如何使用 AWS Go SDK 仅更新 DynamoDB 中的单个字段

2024-02-06 06:02:04 533人浏览 薄情痞子
摘要

问题内容 希望有人能够阐明我一直在努力解决的这个问题。 我在 dynamo 中有这个表,我们称之为 people ,在这个表中,我有 id 的属性作为我们的分区键、name、lastn

问题内容

希望有人能够阐明我一直在努力解决的这个问题。

我在 dynamo 中有这个表,我们称之为 people ,在这个表中,我有 id 的属性作为我们的分区键、namelastnamestatus 。 我希望能够只更新单个属性或保存 id 的所有属性。 现在,这就是我的做法。我创建了以下结构:

type personupdate struct {
    firstname     string `JSON:"firstname,omitempty"`
    lastname      string `json:"lastname,omitempty"`
    status        string `json:"status,omitempty"`
}

来自服务器的请求只是更新该人的姓氏,因此我们的请求正文将如下所示:

{
    "lastname": "bob"
}

将请求绑定到结构后,将发送到 dynamo 的对象如下所示:

{
    "firstname": "",
    "lastname": "bob",
    "status": "",
}

现在,如您所见,当需要写入 dynamo 时,只应更新一个属性,而其余为空/空的属性应被忽略。

为执行此操作而编写的代码可以压缩为以下操作:

// marshal our object
    _, err := dynamodbattribute.marshalmap(person)
    if err != nil{
        fmt.println("some error marshaling")
    }
    // create our update input
    input := &dynamodb.updateiteminput{
        key: map[string]*dynamodb.attributevalue{
            "id":{
                s: aws.string("1234"),
            },
        },
        tablename: aws.string("people"),
        expressionattributevalues: map[string]*dynamodb.attributevalue{
            ":fn": {
                s: aws.string(person.firstname),
            },
            ":ln":{
                s: aws.string(person.lastname),
            },
            ":st":{
                s: aws.string(person.status),
            },
        },
        updateexpression: aws.string("set firstname = :fn, lastname = :ln, status = :st"),
        returnvalues: aws.string("updated_new"),
    }
    // send update request to dynamo
    _, err := service.updateitem(input)

现在,更新没有任何问题,问题是 firstnamestatus 的 null 值也被传递。我尝试过阅读他们的文档,但还是有点困惑。我知道java sdk允许您传递一个名为update_skip_null_attributes的标志,它允许您跳过那些空值并只更新那些有数据的值。我不知道 Go 中的等效项是什么,任何帮助/指导都会很棒。

更新:

尝试使用以下模型:

type usermodel struct {
    firstname string `json:"firstname,omitempty" dynamodbav:"firstname,omitempty"`
    lastname  string `json:"lastname,omitempty" dynamodbav:"lastname,omitempty"`
}

遵循@jarmod 和@fedonev 给出的建议。从逻辑上讲并使用文档就可以理解为什么这应该有效,不幸的是,它没有

决定将 sdk 从 v1 切换到 v2,看看更新它是否会有所帮助,尽管我又陷入了同样的困境。这就是我的更新函数的样子。

update :=expression.Set(expression.Name("firstName"),expression.Value(user.FirstName))
    update.Set(expression.Name("lastName"), expression.Value(user.LastName))

    expr, err := expression.NewBuilder().WithUpdate(update).Build()

    if err != nil {
        "log error here..."
    }

    _, err = svc.UpdateItem(context.TODO(), &dynamodb.UpdateItemInput{
        TableName:                 aws.String("people"),
        Key:                       map[string]types.AttributeValue{"id": id},
        ExpressionAttributeNames:  expr.Names(),
        ExpressionAttributeValues: expr.Values(),
        UpdateExpression:          expr.Update(),
        ReturnValues:              types.ReturnValueUpdatedNew,
    })

    if err != nil {
        "log error here..."

    }

我最终通过编写一个查询和创建函数解决了我的问题,该函数几乎通过我们想要更新的 id 来查询 json 负载,并根据我们需要的内容进行查询的差异进行更新,任何空字段都会被查询结果替换。到目前为止它解决了我的问题,但我仍然想知道如何使用其预期功能进行更新。


正确答案


正如 @jarmod 的评论所说,将 dynamodbav:",omitempty" 标签应用到 编组结构时跳过零值字段:

type personupdate struct {
    firstname     string `json:"firstname,omitempty" dynamodbav:",omitempty"`
    lastname      string `json:"lastname,omitempty" dynamodbav:",omitempty"`
    status        string `json:"status,omitempty" dynamodbav:",omitempty"`
}

[编辑:添加用法] marshalmap 现在将忽略零值字段,尊重标签。迭代地图以构造更新表达式:

av, _ := attributevalue.MarshalMap(person)

update := expression.UpdateBuilder{}

for k, v := range av {
        update = update.Set(expression.Name(k), expression.Value(v))
}

构建表达式并将其输出传递给 updateitem,如op中所示。

以上就是如何使用 AWS Go SDK 仅更新 DynamoDB 中的单个字段的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 如何使用 AWS Go SDK 仅更新 DynamoDB 中的单个字段

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

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

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作