# DynamoDB _**最終更新日:2025/08/17**_ NoSQLのテーブル設計って難しいよね {{toc}} ## パッケージ 「AWSSDK.DynamoDBv2」を使用する。 ・NuGet NuGet Gallery | AWSSDK.DynamoDBv2 https://www.nuget.org/packages/AWSSDK.DynamoDBv2/ このページで使用するパッケージは以下の2つ。 ``` csharp using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.DataModel; ``` ## 操作用クラス ### クライアント クライアントは様々な操作ができるが、マッピングはなし。 このページではクライアントでの操作方法はないので、知りたい人は公式ガイドを見てね。 ``` csharp AmazonDynamoDBClient dynamoDBClient; AmazonDynamoDBConfig dynamoDBConfig = new() { RegionEndpoint = Amazon.RegionEndpoint.APNortheast1, }; dynamoDBClient = new(dynamoDBConfig); ``` ### コンテキスト クライアントに比べてできることは限られているが、マッピングをやってくれる。 やることが読み書きぐらいであれば、コンテキストを使用したほうが楽。 ``` csharp DynamoDBContext dynamoDBContext; dynamoDBContext = new DynamoDBContextBuilder() .WithDynamoDBClient(() => dynamoDBClient) .Build(); ``` ## マッピング コンテキストによるマッピング用のクラスの作り方。 基本的には属性でテーブルと合うように指定するだけ。 属性や型の詳しい解説は公式ガイドを見てね。 ・.NET オブジェクト永続性モデルと DynamoDB の使用 https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DotNetSDKHighLevel.html ・.NET オブジェクト永続性モデルからの DynamoDB 属性 https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DeclarativeTagsList.html ### よく使う属性 ・DynamoDBTable属性 対象のテーブル名を指定 ・DynamoDBHashKey属性 パーティションキーを指定 ・DynamoDBRangeKey属性 ソートキーを指定 ・DynamoDBProperty属性 上記以外の項目属性を指定 ### クラス例 下記のテーブルのマッピング用クラスを作る。 テーブル名は映ってないけど「inventory_table」で定義してある。 {{thumbnail(dynamodb_01.png, size=800, title=クラス例)}} ・InventoryTable.cs ``` csharp [DynamoDBTable("inventory_table")] public record InventoryTable { [DynamoDBHashKey("item_location")] public required string Location { get; set; } [DynamoDBRangeKey("item_id")] public required string ID { get; set; } [DynamoDBProperty("item_name")] public required string Name { get; set; } [DynamoDBProperty("item_quantity")] public required int Quantity { get; set; } [DynamoDBProperty("item_history")] public List History { get; set; } = []; } public record HistoryInfo { [DynamoDBProperty("history_registered_at")] public required DateTime RegisteredAt { get; set; } [DynamoDBProperty("history_remark")] public required string Remark { get; set; } } ``` ## データ読み込み ### パーティションキー指定 パーティションキーを指定して読み込む。 ``` csharp IEnumerable items = await dynamoDBContext .QueryAsync("パーティションキー") .GetRemainingAsync(); ``` ### パーティションキーとソートキー指定 パーティションキーとソートキーを指定して読み込む。 ``` csharp T item = await dynamoDBContext.LoadAsync("パーティションキー", "ソートキー"); ``` ### 任意の項目属性を指定 Scanはコストが高いからオススメしないよ! また、指定する項目属性はテーブル上での名称ではなく、マッピングしたクラスの名称を指定すること。 下記であればテーブル上では「item_name」だけど、マッピングしたクラスでは「Name」で定義してあるので、「Name」を指定する必要がある。 ``` csharp // ↓こっちの名称じゃなくて [DynamoDBProperty("item_name")] public required string Name { get; set; } // ↑こっちの名称 ``` ``` csharp List conditions = [ new("Name", ScanOperator.Equal, "みかん") ]; IEnumerable items = await dynamoDBContext .ScanAsync(conditions) .GetRemainingAsync(); ``` ## データ書き込み ### 単一書き込み ``` csharp await dynamoDBContext.SaveAsync(item); ``` ### 複数書き込み(トランザクションあり) 複数のデータをまとめて書き込む場合はこちら。 ``` csharp ITransactWrite transactWrite = dynamoDBContext.CreateTransactWrite(); transactWrite.AddSaveItems(items); await transactWrite.ExecuteAsync(); ``` ## データ削除 ### 単一削除 ``` csharp await dynamoDBContext.DeleteAsync(item); ``` ### 複数削除(トランザクションあり) 複数のデータをまとめて削除する場合はこちら。 ``` csharp ITransactWrite transactWrite = dynamoDBContext.CreateTransactWrite(); transactWrite.AddDeleteItems(items); await transactWrite.ExecuteAsync(); ``` ## リンク 公式ガイド ・.NET コード例 https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/CodeSamples.DotNet.html --- [[aws:wiki|メインページに戻る]]