Go (AWS SDK v2) での DynamoDB UpdateItem
UpdateItem は1つのアイテムの特定の属性を変更し(アイテムが存在しなければ作成し)、それ以外はそのまま残します。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
}Explanation
Key— 更新するアイテムの完全なプライマリキー。UpdateExpression— 1つ以上の句:SETは属性を代入します(#upd0 = :updValue0はGenreを設定、#upd1 = :updValue1はYearを設定)。すべての属性はExpressionAttributeNamesを介してエイリアス化されるので、Yearのような予約語は常に安全です。- 数値に対する
ADDはアトミックなインクリメントを行います(ADD #upd2 :updValue2はAwardsに 1 を加えます)。並行処理下でも安全で、read-modify-write の競合はありません。REMOVEは属性を削除し、DELETEはセットから要素を除去します。
ExpressionAttributeValues—:placeholder→ 型付き値のマップ(AttributeValueMemberS/...MemberN)。ReturnValues: types.ReturnValueAllNew— 更新後の完全なアイテムをout.Attributesで返します(他にReturnValueUpdatedNew、ReturnValueAllOld、ReturnValueUpdatedOld、ReturnValueNone)。- アップサートのセマンティクス —
UpdateItemはキーが存在しなければアイテムを作成します。更新のみにするにはConditionExpression(例:attribute_exists(Artist))を追加します。 - コードで式を構築したいですか?
expressionパッケージ(github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression)はSET/ADDの句を組み立て、名前/値のマップを代わりに生成します。
Do it visually
DynamoDB Expression Builder は名前/値のマップとともに SET / ADD / REMOVE の句を構築し、実行可能なコードをコピーします。
GUI でアイテムを編集するには(フィールドを変更し、生成された UpdateExpression を確認し、コードをコピー)、DynoTable をダウンロードしてください。
Related examples
- DynamoDB UpdateItem in Java — AWS SDK for Java 2.x による同じ更新。
- DynamoDB PutItem in Go — 代わりにアイテム全体を置き換える。
- DynamoDB update expressions —
SET、ADD、REMOVE、DELETE、およびイディオム。 - Understanding 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
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。