Go(AWS SDK v2)中的 DynamoDB UpdateItem

UpdateItem 更改一个项目的特定属性(若项目不存在则创建它),其余部分保持不变。在 AWS SDK for Go v2 中,你在一个 dynamodb.UpdateItemInput 上用 UpdateExpression 调用 client.UpdateItem

Code

package main

import (
	"context"
	"fmt"
	"log"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/config"
	"github.com/aws/aws-sdk-go-v2/service/dynamodb"
	"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
)

func main() {
	ctx := context.TODO()
	cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion("us-east-1"))
	if err != nil {
		log.Fatalf("load config: %v", err)
	}
	client := dynamodb.NewFromConfig(cfg)

	out, err := client.UpdateItem(ctx, &dynamodb.UpdateItemInput{
		TableName: aws.String("Music"),
		Key: map[string]types.AttributeValue{
			"Artist":    &types.AttributeValueMemberS{Value: "Arturo Sandoval"},
			"SongTitle": &types.AttributeValueMemberS{Value: "Cubano Chant"},
		},
		UpdateExpression: aws.String("SET #upd0 = :updValue0, #upd1 = :updValue1 ADD #upd2 :updValue2"),
		ExpressionAttributeNames: map[string]string{
			"#upd0": "Genre",
			"#upd1": "Year",
			"#upd2": "Awards",
		},
		ExpressionAttributeValues: map[string]types.AttributeValue{
			":updValue0": &types.AttributeValueMemberS{Value: "Latin Jazz"},
			":updValue1": &types.AttributeValueMemberN{Value: "1994"},
			":updValue2": &types.AttributeValueMemberN{Value: "1"},
		},
		ReturnValues: types.ReturnValueAllNew,
	})
	if err != nil {
		log.Fatalf("update item: %v", err)
	}
	fmt.Println(out.Attributes) // the item after the update
}

说明

  • Key — 要更新的项目的完整主键。
  • UpdateExpression — 一个或多个子句:
    • SET 赋值属性(#upd0 = :updValue0 设置 Genre#upd1 = :updValue1 设置 Year)。每个属性都通过 ExpressionAttributeNames 做了别名,因此像 Year 这样的保留字总是安全的。
    • 对数字使用 ADD 会做一次原子递增(ADD #upd2 :updValue2Awards 加 1)——在并发下安全,没有读-改-写竞态。REMOVE 删除一个属性;DELETE 从集合中移除元素。
  • ExpressionAttributeValues:placeholder → 带类型值映射(AttributeValueMemberS/...MemberN)。
  • ReturnValues: types.ReturnValueAllNew — 在 out.Attributes 中返回更新后的完整项目(另有 ReturnValueUpdatedNewReturnValueAllOldReturnValueUpdatedOldReturnValueNone)。
  • Upsert 语义 — 若键不存在,UpdateItem 会创建该项目。加上一个 ConditionExpression(例如 attribute_exists(Artist))可实现仅更新。
  • 更想用代码构建表达式?expressiongithub.com/aws/aws-sdk-go-v2/feature/dynamodb/expression)会组合 SET/ADD 子句并替你生成名称/值映射。

可视化操作

DynamoDB Expression Builder 会连同名称/值映射构建 SET / ADD / REMOVE 子句并复制可运行代码。

想在 GUI 中编辑项目——更改某个字段、审阅生成的 UpdateExpression、复制代码——请下载 DynoTable

相关示例

References

Last verified 2026-07-13 against the official AWS documentation linked above.

无需控制台即可使用 DynamoDB

DynoTable 是面向 DynamoDB 的快速桌面客户端 —— 浏览表、运行 SQL 风格的查询,并在本地编辑项。