Go での DynamoDB GetItem(AWS SDK v2)

AWS SDK for Go v2 では、アイテムは map[string]types.AttributeValue であり、types.AttributeValue は封印されたインターフェースです。実装は SDK が同梱する 10 個の AttributeValueMember* 構造体だけです。これらでキーを書くのは簡単です。値を読み出すところで、Go は他のどの SDK とも違ってきます。

client.GetItem は、他と同じくプライマリキー全体を必要とします。

コード

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.GetItem(ctx, &dynamodb.GetItemInput{
		TableName: aws.String("Music"),
		Key: map[string]types.AttributeValue{
			"Artist":    &types.AttributeValueMemberS{Value: "Arturo Sandoval"},
			"SongTitle": &types.AttributeValueMemberS{Value: "Cubano Chant"},
		},
		ProjectionExpression: aws.String("#proj0, #proj1, #proj2, #proj3"),
		ExpressionAttributeNames: map[string]string{
			"#proj0": "Artist",
			"#proj1": "SongTitle",
			"#proj2": "AlbumTitle",
			"#proj3": "Year",
		},
	})
	if err != nil {
		log.Fatalf("get item: %v", err)
	}

	if out.Item == nil {
		fmt.Println("Item not found")
		return
	}
	fmt.Println(out.Item)
}

解説

  • スカラーはポインタTableNameProjectionExpressionConsistentRead*string*bool です。SDK が「未設定」とゼロ値を区別できるようにするためです。aws.Stringaws.Boolaws.Int32 はそのためだけに存在します。
  • 数値は文字列で届くAttributeValueMemberN.Valuestring です。DynamoDB がワイヤ上で数値を文字列として送るからです。Year を読むには out.Item["Year"].(*types.AttributeValueMemberN) としてから strconv.Atoi します。型アサーションはカンマ ok 形式を使ってください。素の形式は、属性が存在しないときや型が違うときに panic します。
  • 出口は attributevalue.UnmarshalMapgithub.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue にあり、アイテム全体を dynamodbav タグ付きの構造体にマッピングし、文字列から数値への変換も行ってくれます。アイテムの属性が数個を超えた時点で、手を伸ばす価値があります。
  • ヒットしなければ out.Itemnil で、errnil です。両者を区別する必要がなければ、len(out.Item) == 0 で nil と空の両方をカバーできます。
  • エラーは errors.As で照合 — Go v2 はサービス側の障害を Smithy のオペレーションエラーでラップするので、err == …err.Error() の文字列一致も、どちらも黙って失敗します。var nf *types.ResourceNotFoundException を宣言して、そのアドレスを渡してください。
  • ConsistentRead: aws.Bool(true)読み取りコストを倍にし、GSI では拒否されます。上の #proj エイリアスも飾りではありません。Year予約語なので、それを直接指定した射影は拒否されます。

ビジュアルに行う

AttributeValueMember* 形式と素の JSON のあいだの変換は、Go では常につきまとう税金です。DynamoDB JSON コンバータは、アイテムを 1 件読むか貼り付けるだけでよいときに、その往復をブラウザ上で片付けてくれます。

DynoTable なら、アイテムは代わりに普通の行として表示され、グリッドの背後にあるクエリを、ここで使ったものと同じ SDK v2 の型に基づく Go プログラムとしてエクスポートできます。DynoTable をダウンロードしてください。

関連する例

参考資料

最終検証日 2026-07-28、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

Console なしで DynamoDB を扱う

DynamoDB では実行できない本物の SQL(JOINs、GROUP BY、集計)を実行する高速な DynamoDB デスクトップクライアント。ビジュアル編集と、あなた自身の Bedrock キーで動く AI エージェントを備えています。

30日間無料トライアル、クレジットカード不要 — その後は期限のない Free プラン。