質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Amazon DynamoDB

Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

0回答

1732閲覧

GoでDynamoDBから条件に合ったitem(複数 or 単数)を取得したい

rapsody

総合スコア7

Amazon DynamoDB

Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2021/05/08 08:38

解決したいこと

DynamoDBから条件に合ったitem(複数 or 単数)を取得したいです。

やりたいこととしては、下記のようなDynamoDBのテーブルから前日に作成されたitemを取得して、その個数を返却したいです。
例えば、この処理を実行する日が5/8日だとすると、5/7に作成されたitemの個数を返却したいということになります。

useridcreated_timedeleted_time
12021-05-01T02:45:35.483864Z2021-05-08T02:45:35.483864Z
22021-05-02T02:45:35.483864Z2021-05-08T02:45:35.483864Z
32021-05-07T02:45:35.483864Z2021-05-08T02:45:35.483864Z
42021-05-07T04:48:15.483864Z2021-05-08T02:45:35.483864Z
.........

当方、GoやAWSを触り始めたばかりの初心者で知識不足のため、わかりやすく説明していただけると幸いです。
どんな方法があるのか列挙していただいたり、指針を示していただけるだけでありがたいです。
よろしくお願い致します。

現状の下記のコードでは、DBに接続して、getItem()によって指定したテーブル、user_idのitemを一つ取得しております。

Go

1// DB接続 2 sess, err := session.NewSession() 3 if err != nil { 4 return events.APIGatewayProxyResponse{ 5 Body: err.Error(), 6 StatusCode: 500, 7 }, err 8 } 9 10 db := dynamodb.New(sess) 11 12 // 検索条件を用意 13 getParam := &dynamodb.GetItemInput{ 14 TableName: aws.String("tablename"), 15 Key: map[string]*dynamodb.AttributeValue{ 16 "user_id": { 17 N: aws.String(pathparam), 18 }, 19 }, 20 } 21 22 // 検索 23 result, err := db.GetItem(getParam) 24 if err != nil { 25 return events.APIGatewayProxyResponse{ 26 Body: err.Error(), 27 StatusCode: 404, 28 }, err 29 }

下記が全体のプログラムです。(補足)
APIGatewayに紐づけたLambda関数であり、APIGatewayのプロキシリクエストが来ると、DynamoDBのテーブルにアクセスして、itemを取得して返却するというものです。

Go

1package main 2 3import ( 4 "encoding/json" 5 6 "github.com/aws/aws-lambda-go/events" 7 "github.com/aws/aws-lambda-go/lambda" 8 "github.com/aws/aws-sdk-go/aws" 9 "github.com/aws/aws-sdk-go/aws/session" 10 "github.com/aws/aws-sdk-go/service/dynamodb" 11 "github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute" 12) 13 14// Item DBに入れるデータ 15type Item struct { 16 UserID int `dynamodbav:"user_id" json:user_id` 17 CreatedTime string `dynamodbav:"created_time" json:created_time` 18} 19 20// Response Lambdaが返答するデータ 21type Response struct { 22 RequestMethod string `json:RequestMethod` 23 Result Item `json:Result` 24} 25 26func handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { 27 method := request.HTTPMethod 28 pathparam := request.PathParameters["userid"] 29 30 // DB接続 31 sess, err := session.NewSession() 32 if err != nil { 33 return events.APIGatewayProxyResponse{ 34 Body: err.Error(), 35 StatusCode: 500, 36 }, err 37 } 38 39 db := dynamodb.New(sess) 40 41 // 検索条件を用意 42 getParam := &dynamodb.GetItemInput{ 43 TableName: aws.String("tablename"), 44 Key: map[string]*dynamodb.AttributeValue{ 45 "user_id": { 46 N: aws.String(pathparam), 47 }, 48 }, 49 } 50 51 // 検索 52 result, err := db.GetItem(getParam) 53 if err != nil { 54 return events.APIGatewayProxyResponse{ 55 Body: err.Error(), 56 StatusCode: 404, 57 }, err 58 } 59 60 // 結果を構造体にパース 61 item := Item{} 62 err = dynamodbattribute.UnmarshalMap(result.Item, &item) 63 if err != nil { 64 return events.APIGatewayProxyResponse{ 65 Body: err.Error(), 66 StatusCode: 500, 67 }, err 68 } 69 70 // httpレスポンス作成 71 res := Response{ 72 RequestMethod: method, 73 Result: item, 74 } 75 jsonBytes, _ := json.Marshal(res) 76 77 //返り値としてレスポンスを返す 78 return events.APIGatewayProxyResponse{ 79 Body: string(jsonBytes), 80 StatusCode: 200, 81 }, nil 82} 83 84func main() { 85 lambda.Start(handler) 86}

調べたこと

  • 下記サイトにて、TransactGetItems()やBatchGetItem()で複数のitemを取得できそうであることは調べましたが、いまいち使い方がわかりませんでした。

https://docs.aws.amazon.com/sdk-for-go/api/service/dynamodb/#DynamoDB.TransactGetItems

環境

  • VsCode Version: 1.56.0
  • Mac M1
  • Delve Debugger Version: 1.6.0
  • Go version: go1.16.3 darwin/arm64
  • AWS CLI version aws-cli/2.2.0 Python/3.9.4 Darwin/20.3.0 source/arm64 prompt/off

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問