Alexa 기술 (C#)에서 DynamoDB에 액세스하는 방법? (데이터 추가)

18614 단어 C#알렉사DynamoDB

소개



C #으로 DynamoDB에 테이블을 만들었습니다. .

이번에는 거기에 데이터를 추가해 보겠습니다.

데이터 추가 흐름



테이블에 데이터를 추가하려면 AmazonDynamoDBClient 클래스의 PutItemAsync 메서드를 사용합니다.PutItemAsync 메서드에 PutItemRequest 클래스의 인스턴스를 전달하면 해당 인스턴스에 넣은 데이터를 지정된 테이블에 넣을 수 있습니다.

그러므로 흐름은 다음과 같습니다.
  • PutItemRequest의 인스턴스에 테이블 이름과 각 열에 대한 데이터를 등록
  • PutItemAsync 메서드에 PutItemRequest 인스턴스를 인수로 전달하여 실행

  • 소스 코드는 이런 느낌입니다.
                //データを挿入するリクエストを構築
                var request = new PutItemRequest
                {
                    //追加先のテーブル名を指定
                    TableName = tableName,
                    //各カラムに入れるデータを指定
                    Item = new Dictionary<string, AttributeValue>
                    {
                        //「ThisIsId」カラムに「2」という数値を入れる
                        {"ThisIsId",new AttributeValue{N="2"} },
                        //「ThisIsSomething」カラムに「5」という数値を入れる
                        {"ThisIsSomething",new AttributeValue{N="5"} }
                    }
                };
    
                var client = AmazonDynamoDBClient();
    
                //目的のテーブルに所定のデータを追加
                var result = client.PutItemAsync(request).Result;
    

    첫째, 요청을 구축하는 것입니다.
    여기서 열에 넣을 값을 지정합니다.
    그 중에서 「N="2"」등으로 하고 있습니다만, 이것은 수치로서의 「2」를 넣는다는 의미입니다.
    「N」은 데이터의 종류를 나타내고 있다고 하는 것이군요.
    "N"외에도 "S: 문자열(String)", "SS: 문자열 목록", "NS: 숫자 목록"등을 지정할 수 있습니다.

    테이블을 작성할 때 AttributeType 로 "N"을 지정했지만, 그와 같은 지정을 해 주세요.
    덧붙여서 그 기사 을 쓸 때는 의미를 알지 못했습니다.

    추가해 봅시다.



    그렇다면 이상을 바탕으로 테이블에 데이터를 추가해 보겠습니다.
    데이터를 추가하는 처리를 PutItem 라는 메소드로서 잘라내고 있습니다.
    이번에는, 이 메소드안에서 추가하는 데이터를 직접 지정하고 있습니다만, 실용성을 생각한다면 추가하는 데이터를 인수로서 받도록(듯이) 하면 좋을 것입니다.

    Function.cs
    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    using Amazon.Lambda.Core;
    using Alexa.NET.Request;
    using Alexa.NET.Response;
    using Amazon.DynamoDBv2;
    using Amazon.DynamoDBv2.Model;
    
    
    // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
    [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]
    
    namespace DynamoDBTest
    {
        public class Function
        {
            /// <summary>
            /// A simple function that takes a string and does a ToUpper
            /// </summary>
            /// <param name="input"></param>
            /// <param name="context"></param>
            /// <returns></returns>
            public SkillResponse FunctionHandler(SkillRequest input, ILambdaContext context)
            {
                //ここにDynamoDBにアクセスするコードを追加していく
                string tableName = "TestTable";//テーブル名
                AmazonDynamoDBClient client = new AmazonDynamoDBClient();//主役。これを介してDynamoDBにアクセスする
    
                //同名テーブルの存在確認
                if (!IsTableExist(client, tableName))
                {
                    //テーブルを作成
                    CreateTable(client, tableName);
                }
    
                PutItem(client, tableName);
    
                return new SkillResponse
                {
                    Version = "1.0",
                    Response = new ResponseBody()
                };
            }
    
    
            /// <summary>
            /// DynamoDBにテーブルを作成する
            /// </summary>
            /// <param name="client"></param>
            /// <param name="tableName"></param>
            private void CreateTable(IAmazonDynamoDB client, string tableName)
            {
                //リクエストを構築
                var request = new CreateTableRequest
                {
                    //テーブルの列情報を設定
                    //「ThisIsId」と「ThisIsSomthing」という2つの列を持つテーブルを作る
                    AttributeDefinitions = new List<AttributeDefinition>()
                    {
                        new AttributeDefinition
                        {
                            AttributeName = "ThisIsId",//カラム名
                            AttributeType = "N"//データのタイプ:N:数値、S:文字列、他にもいくつか。勉強中
                        },
                        new AttributeDefinition
                        {
                            AttributeName = "ThisIsSomething",//カラム名
                            AttributeType = "N"//データのタイプ:N:数値、S:文字列、他にもいくつか。勉強中
                        }
                    },
                    //勉強中
                    KeySchema = new List<KeySchemaElement>
                    {
                        new KeySchemaElement
                        {
                            AttributeName = "ThisIsId",
                            KeyType = KeyType.HASH //Partition key
                        },
                        new KeySchemaElement
                        {
                            AttributeName = "ThisIsSomething",
                            KeyType = KeyType.RANGE,//Sort key
                        }
                    },
                    //勉強中
                    ProvisionedThroughput = new ProvisionedThroughput
                    {
                        ReadCapacityUnits = 5,
                        WriteCapacityUnits = 5
                    },
                    //テーブル名
                    TableName = tableName
                };
    
                //テーブル作成リクエストを投げる!
                //ただし、非同期メソッドの返りを待たねければならない。
                //待たないと先にこのLambdaが終了して、DynamoDBのテーブル作成処理を完了せずに終わる。
                //でもメソッドにasyncつけたら、最終的にスキルのレスポンスの型もTask<SkillResponse>にしなきゃいけなくなってだめ。
                //.Wait()メソッドで非同期メソッドを同期メソッドにしちゃえば、返り値も変えなくていいし、テーブル作成完了まで待つことができる。
                //一回完結のサーバー側の処理で非同期でなきゃいけない理由ないしね。
                //client.CreateTableAsync(request).Wait();
    
                //Waitメソッドではただ非同期メソッドの完了を待つだけでしたが、非同期メソッドの返り値を取得したい場合は、Resultプロパティを使いましょう。
                //Resultプロパティにアクセスすることで、非同期メソッドの完了を待った上で結果を取得することができます。
                //結果を使って何か処理を行いたい場合はこちらが良いのではないでしょうか。
                var result = client.CreateTableAsync(request).Result;
            }
    
    
            /// <summary>
            /// 同名のテーブルが存在するかをチェックします。
            /// </summary>
            /// <param name="client"></param>
            /// <param name="tableName"></param>
            /// <returns></returns>
            private bool IsTableExist(IAmazonDynamoDB client, string tableName)
            {
                //テーブル一覧を取得
                var tableList = client.ListTablesAsync().Result;
                //TableNamesプロパティをチェック
                return tableList.TableNames.Exists(s => s.Equals(tableName));
            }
    
    
            /// <summary>
            /// データをテーブルに追加します。
            /// </summary>
            /// <param name="client"></param>
            /// <param name="tableName"></param>
            private void PutItem(IAmazonDynamoDB client, string tableName)
            {
                //リクエストの構築
                var request = new PutItemRequest
                {
                    TableName = tableName,//追加先のテーブル名
                    //各カラムの値を指定
                    Item = new Dictionary<string, AttributeValue>
                    {
                        {"ThisIsId",new AttributeValue{N= "2"} },
                        {"ThisIsSomething",new AttributeValue{N="5"} }
                    }
                };
    
                //テーブルに追加
                var result = client.PutItemAsync(request).Result;
            }
        }
    }
    
    

    이전과 같이 배포하고 테스트해 봅시다.
    AWS 콘솔에서 확인해 보면 다음과 같이 데이터가 추가되었는지 확인할 수 있습니다.



    결론



    테이블에 데이터를 추가하는 흐름과 기본적인 방법에 대해 약간의 이해가 진행되었습니다.
    그러나 이것은 단순한 데이터의 추가뿐이기 때문에, Alexa 스킬로 데이터의 보관에 사용하기에는 아직 부족한 일뿐입니다.
    하지만 다음은 이것을 바탕으로 공식 튜토리얼 제4회 을 C#로 해보려고 합니다.
    그 시행착오에 의해 더욱 이해가 진행될 것으로 생각합니다.

    좋은 웹페이지 즐겨찾기