PowerShellでAzure テーブル ストレージ を操作する(Insert,Query etc)

C#からAzureテーブルストレージを操作する方法はこちらに書いてあったので、これを参考にPowerShellで置き換えてみました。

http://azure.microsoft.com/ja-jp/documentation/articles/storage-dotnet-how-to-use-tables/
https://acomdpsstorage.blob.core.windows.net/dpsmedia-prod/azure.microsoft.com/ja-jp/documentation/articles/storage-dotnet-how-to-use-tables/20150114060423/includes/howto-table-storage/table1.png

ストレージアカウントへの接続コンテキスト生成

Azureストレージへの接続のためのコンテキストを作ります。ここで生成したオブジェクトを利用して後の処理を実行していきます。

Import-Module Azure
$storageAccountName = "ストレージアカウント名"
$storageAccessKey = "アクセスキー"
$context = New-AzureStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccessKey

テーブルを作成

customersテーブルを作成します。

$tableName = "customers"
New-AzureStorageTable -Context $context -Name $tableName

 

テーブルの参照を取得

作成したテーブルの参照を取得します。

$table = Get-AzureStorageTable -Context $context -Name $tableName

ここでAzureStorageTableオブジェクトの参照が取得できますが、実際によく使うのはCloudTableプロパティから取得できるCloudTableオブジェクトです。

PS>($table.CloudTable).GetType()
IsPublic IsSerial Name                                     BaseType                                                                                                  
-------- -------- ----                                     --------                                                                                                  
True     False    CloudTable                               System.Object 



エンティティをテーブルに追加する

#TableEntityオブジェクトの生成
$customer1  = New-Object -TypeName Microsoft.WindowsAzure.Storage.Table.TableEntity -ArgumentList "Smith","Jeff" |
                 Add-Member -Name "Email" -Value "Jeff@contoso.com" -MemberType NoteProperty -PassThru |
                 Add-Member -Name "PhoneNumber" -Value "425-555-0104" -MemberType NoteProperty -PassThru

$customer2  = New-Object -TypeName Microsoft.WindowsAzure.Storage.Table.TableEntity -ArgumentList "Smith","Ben" |
                 Add-Member -Name "Email" -Value "Ben@contoso.com" -MemberType NoteProperty -PassThru |
                 Add-Member -Name "PhoneNumber" -Value "425-555-0102" -MemberType NoteProperty -PassThru

#Insert用のTableOperationを定義
$operation1 = [Microsoft.WindowsAzure.Storage.Table.TableOperation]::Insert($customer1)
$operation2 = [Microsoft.WindowsAzure.Storage.Table.TableOperation]::Insert($customer2)

#定義したTableOperationの実行
$table.CloudTable.Execute($operation1)
$table.CloudTable.Execute($operation2)

単一エンティティの取得

$retrieveOperation = [Microsoft.WindowsAzure.Storage.Table.TableOperation]::Retrieve("Smith", "Ben")
$result = $table.CloudTable.Execute($retrieveOperation)

 

Resultプロパティの中にエンティティが入っています。

PS> $result.Result
Properties   : {}
PartitionKey : Smith
RowKey       : Ben
Timestamp    : 2015/01/16 2:30:03 +00:00
ETag         : W/"datetime'2015-01-16T02%3A30%3A03.6278194Z'"

 
 

クエリの実行

$query = New-Object -TypeName Microsoft.WindowsAzure.Storage.Table.TableQuery
$query.FilterString = [Microsoft.WindowsAzure.Storage.Table.TableQuery]::GenerateFilterCondition(
                        "PartitionKey", [Microsoft.WindowsAzure.Storage.Table.QueryComparisons]::Equal, "Smith"
                      )
$table.CloudTable.ExecuteQuery($query)

結果は以下のようになります。エンティティのリストが取れます。

Properties   : {}
PartitionKey : Smith
RowKey       : Ben
Timestamp    : 2015/01/16 2:30:03 +00:00
ETag         : W/"datetime'2015-01-16T02%3A30%3A03.6278194Z'"

Properties   : {}
PartitionKey : Smith
RowKey       : Jeff
Timestamp    : 2015/01/16 2:30:03 +00:00
ETag         : W/"datetime'2015-01-16T02%3A30%3A03.4338194Z'"



複数の条件を組み合わせたい場合はCombineFiltersを利用します。

$query.FilterString =[Microsoft.WindowsAzure.Storage.Table.TableQuery]::CombineFilters(
                            [Microsoft.WindowsAzure.Storage.Table.TableQuery]::GenerateFilterCondition(
                                "prop1", [Microsoft.WindowsAzure.Storage.Table.QueryComparisons]::Equal, "value1"                       
                            ),
                            [Microsoft.WindowsAzure.Storage.Table.TableOperators]::And,
                            [Microsoft.WindowsAzure.Storage.Table.TableQuery]::GenerateFilterCondition(
                                "prop2", [Microsoft.WindowsAzure.Storage.Table.QueryComparisons]::Equal, "value2"
                            )
                      )

なお、TableOperatorsとして使えるのはAnd、Or、Notです。
TableOperators Members (Microsoft.WindowsAzure.Storage.Table)
 
QueryComparisonsとして利用できるのは以下の6つです。
QueryComparisons Fields (Microsoft.WindowsAzure.Storage.Table)

Name Description
Equal the Equal operator.
GreaterThan the Greater Than operator.
GreaterThanOrEqual the Greater Than or Equal operator.
LessThan the Less Than operator.
LessThanOrEqual the Less Than or Equal operator.
NotEqual the Not Equal operator.

 
値はOData形式で設定する必要があります。DateTimeなどは要注意。
Azure Storage TableをTimeStampを使ってクエリする - YOMON8.NET


テーブルの削除

Remove-AzureStorageTable -Context $context -Name $tableName -Force