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 :updValue2给Awards加 1)——在并发下安全,没有读-改-写竞态。REMOVE删除一个属性;DELETE从集合中移除元素。
ExpressionAttributeValues—:placeholder→ 带类型值映射(AttributeValueMemberS/...MemberN)。ReturnValues: types.ReturnValueAllNew— 在out.Attributes中返回更新后的完整项目(另有ReturnValueUpdatedNew、ReturnValueAllOld、ReturnValueUpdatedOld或ReturnValueNone)。- Upsert 语义 — 若键不存在,
UpdateItem会创建该项目。加上一个ConditionExpression(例如attribute_exists(Artist))可实现仅更新。 - 更想用代码构建表达式?
expression包(github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression)会组合SET/ADD子句并替你生成名称/值映射。
可视化操作
DynamoDB Expression Builder 会连同名称/值映射构建 SET / ADD / REMOVE 子句并复制可运行代码。
想在 GUI 中编辑项目——更改某个字段、审阅生成的 UpdateExpression、复制代码——请下载 DynoTable。
相关示例
- Java 中的 DynamoDB UpdateItem — 用 AWS SDK for Java 2.x 完成同样的更新。
- Go 中的 DynamoDB PutItem — 改为替换整个项目。
- DynamoDB 更新表达式 —
SET、ADD、REMOVE、DELETE及惯用法。 - 理解 ReturnValues — 每个
ReturnValues选项分别给你什么。 - "Attribute name is a reserved keyword" — 为什么这里的别名映射不是可选的。
- "Invalid UpdateExpression" syntax errors — 常见的 SET/ADD 语法错误解读。
References
- UpdateItem — Amazon DynamoDB API Reference
- Use UpdateItem with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- dynamodb package — AWS SDK for Go v2 (pkg.go.dev)
- dynamodb/types package — AWS SDK for Go v2 (pkg.go.dev)
- expression package — AWS SDK for Go v2 (pkg.go.dev)
- Update expressions — Amazon DynamoDB Developer Guide
Last verified 2026-07-13 against the official AWS documentation linked above.