使用 Airtable 在小型需求上取代傳統資料庫
我好幾年沒有用傳統的關聯式資料庫了。
老實說,傳統的關聯式資料庫,其實對於教育訓練和小型的專案來說,是一種負擔。
如果你想讓學員清楚的掌握一門技術,就好比說,對談機器人的開發吧,在整個教學的過程中,若是範例用到SQL或MySQL資料庫,無疑是一種節外生枝,把問題變得更複雜。因為,在對談機器人當中,儲存只是一種迫不得已的額外需求,是枝微末節,而非對談機器人技術的主體。
同樣的,如果你做一個小型專案或POC的話,『儲存』也往往不是重點,儲存只是『必要之惡』。其實,若是從這個角度廣義的來說,軟體開發的GUI、資料庫,都只是細節(枝微末節),都應該要是可以隨時被抽換或取代的部分,而非系統核心。
一套軟體或解決方案的真正核心,是商業邏輯。它(商業邏輯)才是一個應用程式真正展現價值的部分。
我們把主題拉回來。所以,我最近這幾年在上課的時候,盡量不讓範例程式碼涉及資料庫存取,特別是關聯式資料庫的存取。因為這對讀者或學員來說,變成了另一種必須學習的負擔。
但說的容易,如果範例中有碰到需要儲存資料的時候該怎麼辦呢? 有沒有什麼最簡單的儲存機制可以在程式碼中替代傳統資料庫? 這也是我最近幾年寫範例的時候,常常碰到的問題。因此,我特別花了一段時間,找看看有沒有什麼好用的『類』資料庫儲存體?
最後,我選擇了 Airtable。
Airtable
Airtable 是一個靈活的雲端資料庫產品,結合了資料庫的功能和電子表格(data grid)的簡易性。它允許用戶以視覺化的方式存儲、組織和協作各種資訊:
白話一點說,就是它可以很自由的在Web畫面上設計欄位和維護(輸入、編輯)資料。
對我來說,它還有另一個重點,就是它擁有非常簡單的REST API,透過呼叫API就可以直接來讀寫資料。
它的API在使用上很簡單,只需要在設計好資料表之後,透過 https://airtable.com/create/tokens 站台建立一個 PAT(Personal Access Token):
建立PAT的時候,可以選擇要針對所有資料表,還是特定資料表,要只給這個token 讀取(Read)權限,還是要寫入(Write)權限:
有了token之後,可以透過很標準的REST API呼叫,進行連線的建立與資料的寫入:
string ID = "👉air_table_ID";
string Table = "👉air_table_TableID";
string PAT = "👉air_table_PAT";
// 你的個人存取令牌和基礎數據庫 ID
string api_url = $"https://api.airtable.com/v0/{ID}/{Table}";
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {PAT}");
// 新增資料
async Task AddData(string field1, string value1, string field2, string value2)
{
var data = new
{
fields = new Dictionary<string, object>
{
{ field1, value1 },
{ field2, value2 }
}
};
var json = Newtonsoft.Json.JsonConvert.SerializeObject(data);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync(api_url, content);
if (response.IsSuccessStatusCode)
{
Console.WriteLine("資料新增成功");
}
else
{
Console.WriteLine("資料新增失敗: " + await response.Content.ReadAsStringAsync());
}
}
上面程式碼中的air_table_TableID 和 air_table_ID,本質上就是你的資料庫ID和資料表ID:
也就是說,只要有 database ID 和 Table ID,很容易的就可以透過官方提供的 Rest API 來讀寫資料:
有這個免費的雲端服務,我根本連WebAPI都不用寫,就可以直接把JSON資料存入資料表中。
查詢的時候,雖然不能用傳統的SQL語法,但可以更簡單的透過 Query API來完成:
// 搜尋資料
async Task SearchRecord(string field, string value)
{
var filterByFormula = $"({field} = '{value}')";
var paramsString = $"filterByFormula = {filterByFormula}";
Console.WriteLine(paramsString);
var response = await client.GetAsync($"{api_url}?{paramsString}");
if (response.IsSuccessStatusCode)
{
var json = await response.Content.ReadAsStringAsync();
dynamic ?result= Newtonsoft.Json.JsonConvert.DeserializeObject(json);
if (result != null)
{
var records = result.records;
// 顯示有幾筆資料
Console.WriteLine($"共有{records.Count}筆資料");
// 顯示每一筆資料
foreach (var record in records)
{
Console.WriteLine(record);
}
}
else
{
Console.WriteLine("找不到資料");
}
}
else
{
Console.WriteLine("資料查詢失敗: " + await response.Content.ReadAsStringAsync());
Console.WriteLine("response.status_code: " + response.StatusCode);
}
}
自由度高、簡潔、單純,對於小量資料存取來說,真的沒有比這還簡單的方法了。
最近這幾年,由於前後端分離的開發架構愈來愈明確,開發人員慢慢也愈來愈少直接用SQL指令來操作資料庫了,反倒是對JSON資料的操作相形之下愈來愈頻繁。
如果,你在面對小型系統或POC的開發時,也想要者一個可以快速上手方便好操作的『類』資料表儲存體,Airtable 真的可以看看,不錯用。
我底下準備了c-sharp和python存取範例,請笑納:
c-sharp
https://github.com/isdaviddong/ex_ReadWriteAirTable_cs.git
python
https://github.com/isdaviddong/ex_ReadWriteAirTable_py.git
留言