DynamoDB¶
最終更新日:2025/08/17
NoSQLのテーブル設計って難しいよね
- 目次
- DynamoDB
パッケージ¶
「AWSSDK.DynamoDBv2」を使用する。
・NuGet
NuGet Gallery | AWSSDK.DynamoDBv2
https://www.nuget.org/packages/AWSSDK.DynamoDBv2/
このページで使用するパッケージは以下の2つ。
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DataModel;
操作用クラス¶
クライアント¶
クライアントは様々な操作ができるが、マッピングはなし。
このページではクライアントでの操作方法はないので、知りたい人は公式ガイドを見てね。
AmazonDynamoDBClient dynamoDBClient;
AmazonDynamoDBConfig dynamoDBConfig = new()
{
RegionEndpoint = Amazon.RegionEndpoint.APNortheast1,
};
dynamoDBClient = new(dynamoDBConfig);
コンテキスト¶
クライアントに比べてできることは限られているが、マッピングをやってくれる。
やることが読み書きぐらいであれば、コンテキストを使用したほうが楽。
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」で定義してある。
・InventoryTable.cs
[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<HistoryInfo> 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; }
}
データ読み込み¶
パーティションキー指定¶
パーティションキーを指定して読み込む。
IEnumerable<T> items = await dynamoDBContext
.QueryAsync<T>("パーティションキー")
.GetRemainingAsync();
パーティションキーとソートキー指定¶
パーティションキーとソートキーを指定して読み込む。
T item = await dynamoDBContext.LoadAsync<T>("パーティションキー", "ソートキー");
任意の項目属性を指定¶
Scanはコストが高いからオススメしないよ!
また、指定する項目属性はテーブル上での名称ではなく、マッピングしたクラスの名称を指定すること。
下記であればテーブル上では「item_name」だけど、マッピングしたクラスでは「Name」で定義してあるので、「Name」を指定する必要がある。
// ↓こっちの名称じゃなくて
[DynamoDBProperty("item_name")]
public required string Name { get; set; }
// ↑こっちの名称
List<ScanCondition> conditions =
[
new("Name", ScanOperator.Equal, "みかん")
];
IEnumerable<T> items = await dynamoDBContext
.ScanAsync<T>(conditions)
.GetRemainingAsync();
データ書き込み¶
単一書き込み¶
await dynamoDBContext.SaveAsync<T>(item);
複数書き込み(トランザクションあり)¶
複数のデータをまとめて書き込む場合はこちら。
ITransactWrite<T> transactWrite = dynamoDBContext.CreateTransactWrite<T>();
transactWrite.AddSaveItems(items);
await transactWrite.ExecuteAsync();
データ削除¶
単一削除¶
await dynamoDBContext.DeleteAsync<T>(item);
複数削除(トランザクションあり)¶
複数のデータをまとめて削除する場合はこちら。
ITransactWrite<T> transactWrite = dynamoDBContext.CreateTransactWrite<T>();
transactWrite.AddDeleteItems(items);
await transactWrite.ExecuteAsync();
リンク¶
公式ガイド
・.NET コード例
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/CodeSamples.DotNet.html