使用 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

留言

這個網誌中的熱門文章

在POC或迷你專案中使用 LiteDB

使用Qdrant向量資料庫實作語意相似度比對

專業的價值...

周末讀書會 - 一如既往