由於最近公司開始有一些Azure的站台需要紀錄資料,原本考慮直接用檔案處理掉就好了,但後考量到資料的查詢問題,就開始尋找比較方便又快速的解法,Azure Storage Table 剛好就這麼的是何,並且可以透過 Azure Function 進行中介,實在是方便。
A. 何謂Azure 資料表儲存體(Storage Table)
說到建立資料表,通常就會想到資料表關聯、索引等等的一堆麻煩瑣事,但是如果沒有需要那麼複雜的資料設計,又必須要資料表來儲存資料,就可以考慮使用 Azure Storage Table, 資料表儲存體是可將結構化的非關聯式資料儲存在Azure上,又可以快速地新增查詢。
B. 資料表儲存體簡介
Azure的儲存體,分為幾個層次由Account開始,Account指的是Azure的儲存體帳戶, Account可以有多個Table,而每個Table又會包含許多的實體(Entity),實體裡面就會包含資料夾屬性(資料表欄位)。
資料表實體的繼承的是Microsoft.WindowsAzure.Storage.Table.TableEntity類別,所以也會有幾個幾本的屬性,
- PartitionKey:分區鍵,這個屬性擁有類似分類的功能,例如,我們會因應使用資料表的程式不一樣將PartitionKey設為Web、API、Service等等的。
- RowKey :行鍵,定義PartitionKey裡的唯一值。
- Timestamp – 時間戳記,由系統紀錄此Entity何時被修改過。
屬性的型別參考如下表:
Data Type | Property Type | Details |
Binary | byte[] | An array of bytes up to 64 KB in size. |
Bool | bool | A Boolean value. |
DateTime | DateTime | A 64-bit value expressed as UTC time. The supported range of values is 1/1/1601 to 12/31/9999. |
Double | double | A 64-bit floating point value. |
GUID | Guid | A 128-bit globally unique identifier. |
Int | Int32 or int | A 32-bit integer. |
Int64 | Int64 or long | A 64-bit integer. |
String | String | A UTF-16-encoded value. String values may be up to 64 KB in size. |
C. 範例使用Azure Function進行資料表儲存體操作
現在就使用 Azure Function 接收一個HTTP Request 然後將資料存回資料表儲存體。
1.先建立一個HTTP trigger的Function
2.建立完後的會得到的預設的程式碼
using System.Net;
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req,ICollector<OutputModel> outputTable, TraceWriter log) { log.Info(“C# HTTP trigger function processed a request.”);
// parse query parameter string name = req.GetQueryNameValuePairs() .FirstOrDefault(q => string.Compare(q.Key, “name”, true) == 0) .Value; if (name == null) { // Get request body dynamic data = await req.Content.ReadAsAsync<object>(); name = data?.name; } return name == null ? req.CreateResponse(HttpStatusCode.BadRequest, “Please pass a name on the query string or in the request body”) : req.CreateResponse(HttpStatusCode.OK, “Hello ” + name); } |
3.新增輸出選項,選擇Azure 資料表儲存體
其中的資料表參數名稱,為等等在Azure Function時操作使用的參數。
4.先建立一個Model 來定義你的資料屬性
public class OutputModel
{ public string PartitionKey { get; set; } public string RowKey { get; set; } public string Name { get; set; } } |
5.在Azure Function裡新增一筆資料完整程式碼
using System.Net;
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req,ICollector<OutputModel> outputTable, TraceWriter log) { log.Info(“C# HTTP trigger function processed a request.”);
// parse query parameter string name = req.GetQueryNameValuePairs() .FirstOrDefault(q => string.Compare(q.Key, “name”, true) == 0) .Value;
if (name == null) { // Get request body dynamic data = await req.Content.ReadAsAsync<object>(); name = data?.name; }
outputTable.Add( new OutputModel() { PartitionKey = “Test”, RowKey = DateTime.Today.Day.ToString(), Name = $”Hello {name}\r\n” + DateTime.Now.ToString() } ); return name == null ? req.CreateResponse(HttpStatusCode.BadRequest, “Please pass a name on the query string or in the request body”) : req.CreateResponse(HttpStatusCode.OK, “Hello ” + name); } public class OutputModel { public string PartitionKey { get; set; } public string RowKey { get; set; } public string Name { get; set; } } |
6.測試是否有將資料存入資料表儲存體
Azure Storage Explorer請參考Azure 儲存體總管
(https://azure.microsoft.com/zh-tw/features/storage-explorer)
Azure Function 加上 資料表儲存體,真的是很方便,可以快速的將資料倉儲,如果需要可以再進一步的進行分析處理,就可以分階段並快速地完成許多繁瑣的工作,真的是很方便呢。
D. Reference
https://docs.microsoft.com/zh-tw/azure/storage/tables/table-storage-overview