在 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— 要更新之項目的完整 primary key。UpdateExpression— 一或多個子句:SET指派屬性(#upd0 = :updValue0設定Genre;#upd1 = :updValue1設定Year)。每個屬性都透過ExpressionAttributeNames以別名表示,因此像Year這樣的保留字永遠安全。ADD對數字執行 atomic 遞增(ADD #upd2 :updValue2為Awards加 1)— 在並行下安全,沒有 read-modify-write 競爭。REMOVE刪除一個屬性;DELETE從 set 移除元素。
ExpressionAttributeValues—:placeholder→ 帶型別值的 map(AttributeValueMemberS/...MemberN)。ReturnValues: types.ReturnValueAllNew— 在out.Attributes回傳更新後的完整項目(另有ReturnValueUpdatedNew、ReturnValueAllOld、ReturnValueUpdatedOld或ReturnValueNone)。- Upsert 語意 — 若 key 不存在,
UpdateItem會建立該項目。加上ConditionExpression(例如attribute_exists(Artist))可改為只更新。 - 偏好在程式碼中建立運算式?
expression套件(github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression)會為你組合SET/ADD子句並產生 name/value map。
改用視覺化操作
DynamoDB Expression Builder 會以 name/value map 建立 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" — 為什麼這裡的別名 map 並非選用。
- "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
最後驗證於 2026-07-13,對照上方連結的 AWS 官方文件。