ヘッダー
C# サンプル集
 

テーブルAPI でエンティティを削除する

2021/6/6

→ Visual Basic のサンプルに切り替える

この記事は Azure Cosmos DB テーブル API を対象にしています。

Azure Cosmos DB Table API の概要 | Microsoft Docs

 

 

エンティティを1つ削除する

前提

  • Azure Cosmos DB のアカウントがあり、テーブルAPIのデータベース上に TestTable というテーブルが存在する。
  • NuGet で Microsoft.Azure.Cosmos.Table パッケージをインストールしている。 → NuGetの使用方法
  • using Microsoft.Azure.Cosmos.Table; がソースコードの冒頭付近に記載されている。

メモ:接続文字列の確認方法

//▼Cosmos DBに接続
//接続文字列は環境に応じて指定してください。
string connectionString = "DefaultEndpointsProtocol=https;AccountName=xxxxxx;AccountKey=U2V0IHlvdXIgYWNjb3VudCBrZXkgZnJvbSBhenVyZSBwb3J0YWw=;TableEndpoint=https://xxxxxx.table.cosmos.azure.com:443/;";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

//▼テーブルへの参照を取得
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference("TestTable");

//▼削除するエンティティを生成
//PartitionKey=徳川、RowKey=綱吉のエンティティを削除対象とします。
DynamicTableEntity entity = new DynamicTableEntity();
entity.PartitionKey = "徳川";
entity.RowKey = "綱吉";
entity.ETag = "*"; //更新状況によらない無条件での削除を設定します。

//▼削除操作を実行
TableOperation deleteOperation = TableOperation.Delete(entity);
TableResult result = table.Execute(deleteOperation);
//非同期版もあります。
//TableResult result = await table.ExecuteAsync(deleteOperation);

//▼結果
//この操作で消費された要求ユニット(RU)の使用量を出力します。
if (result.RequestCharge.HasValue)
{
    System.Diagnostics.Debug.WriteLine("要求ユニット使用量: " + result.RequestCharge); // 7.43
}

Debug.WriteLineが表示される場所

メモ:DynamicTableEntityの代わりに、TableEntityを継承した独自のクラスを使用することもできます。

メモ:取得したエンティティを削除する場合、取得後にエンティティが変更されていても削除するのであれば ETag を "*" に設定してから削除を実行します。

 

 

複数のエンティティを一度に削除する

例外が発生した場合、すべての削除が失敗します。

前提

  • Azure Cosmos DB のアカウントがあり、テーブルAPIのデータベース上に TestTable というテーブルが存在する。
  • NuGet で Microsoft.Azure.Cosmos.Table パッケージをインストールしている。 → NuGetの使用方法
  • using Microsoft.Azure.Cosmos.Table; がソースコードの冒頭付近に記載されている。

メモ:接続文字列の確認方法

//▼Cosmos DBに接続
//接続文字列は環境に応じて指定してください。
string connectionString = "DefaultEndpointsProtocol=https;AccountName=xxxxxx;AccountKey=U2V0IHlvdXIgYWNjb3VudCBrZXkgZnJvbSBhenVyZSBwb3J0YWw=;TableEndpoint=https://xxxxxx.table.cosmos.azure.com:443/;";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

//▼テーブルへの参照を取得
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference("TestTable");

//▼削除操作を実行
//ETag に * 以外の値を設定すると ETag が一致した場合のみ削除を実行します。無条件で削除する場合は * を指定します。
var batch = new TableBatchOperation();
batch.Add(TableOperation.Delete(new DynamicTableEntity {PartitionKey = "徳川", RowKey = "家康", ETag = "*"}));
batch.Add(TableOperation.Delete(new DynamicTableEntity {PartitionKey = "徳川", RowKey = "秀忠", ETag = "*"}));
batch.Add(TableOperation.Delete(new DynamicTableEntity {PartitionKey = "徳川", RowKey = "家光", ETag = "*"}));
batch.Add(TableOperation.Delete(new DynamicTableEntity {PartitionKey = "徳川", RowKey = "家綱", ETag = "*"}));
batch.Add(TableOperation.Delete(new DynamicTableEntity {PartitionKey = "徳川", RowKey = "綱吉", ETag = "*"}));
batch.Add(TableOperation.Delete(new DynamicTableEntity {PartitionKey = "徳川", RowKey = "家宣", ETag = "*"}));
batch.Add(TableOperation.Delete(new DynamicTableEntity {PartitionKey = "徳川", RowKey = "家継", ETag = "*"}));
batch.Add(TableOperation.Delete(new DynamicTableEntity {PartitionKey = "徳川", RowKey = "吉宗", ETag = "*"}));
batch.Add(TableOperation.Delete(new DynamicTableEntity {PartitionKey = "徳川", RowKey = "家重", ETag = "*"}));
batch.Add(TableOperation.Delete(new DynamicTableEntity {PartitionKey = "徳川", RowKey = "家治", ETag = "*"}));
batch.Add(TableOperation.Delete(new DynamicTableEntity {PartitionKey = "徳川", RowKey = "家斉", ETag = "*"}));
batch.Add(TableOperation.Delete(new DynamicTableEntity {PartitionKey = "徳川", RowKey = "家慶", ETag = "*"}));
batch.Add(TableOperation.Delete(new DynamicTableEntity {PartitionKey = "徳川", RowKey = "家定", ETag = "*"}));
batch.Add(TableOperation.Delete(new DynamicTableEntity {PartitionKey = "徳川", RowKey = "家茂", ETag = "*"}));
batch.Add(TableOperation.Delete(new DynamicTableEntity {PartitionKey = "徳川", RowKey = "慶喜", ETag = "*"}));

TableBatchResult result = table.ExecuteBatch(batch);
//非同期版もあります。
//TableBatchResult result = await table.ExecuteBatchAsync(batch);

//▼結果
//この操作で消費された要求ユニット(RU)の使用量を出力します。
if (result.RequestCharge.HasValue)
{
    System.Diagnostics.Debug.WriteLine("要求ユニット使用量: " + result.RequestCharge); // 109.68
}

Debug.WriteLineが表示される場所

メモ:DynamicTableEntityの代わりに、TableEntityを継承した独自のクラスを使用することもできます。

メモ:最大で100個のエンティティを一度に削除できます。通信量(ペイロード)は4MiBに制限されます。

 

 

テーブル内のすべてのエンティティを削除する

前提

  • Azure Cosmos DB のアカウントがあり、テーブルAPIのデータベース上に TestTable というテーブルが存在する。
  • NuGet で Microsoft.Azure.Cosmos.Table パッケージをインストールしている。 → NuGetの使用方法
  • using Microsoft.Azure.Cosmos.Table; がソースコードの冒頭付近に記載されている。

メモ:接続文字列の確認方法

//▼Cosmos DBに接続
//接続文字列は環境に応じて指定してください。
string connectionString = "DefaultEndpointsProtocol=https;AccountName=xxxxxx;AccountKey=U2V0IHlvdXIgYWNjb3VudCBrZXkgZnJvbSBhenVyZSBwb3J0YWw=;TableEndpoint=https://xxxxxx.table.cosmos.azure.com:443/;";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

//▼テーブルへの参照を取得
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference("TestTable");

//▼全削除実行
TableQuery query = new TableQuery();

foreach (var entity in table.ExecuteQuery(query))
{
    table.Execute(TableOperation.Delete(entity));
}

メモ:すべてのエンティティを削除する場合は、テーブルをまるごと削除した方が効率的かもしれません。

メモ:このサンプルは、テーブルから全件取得して1件ずつ削除していくものです。取得後に変更・追加されたエンティティは削除されません。

 

参考

.NET Standard SDK を使用した Azure Cosmos DB Table API | Microsoft Docs

クイック スタート:.NET での Table API の使用 - Azure Cosmos DB | Microsoft Docs