前提

平常在準備 LINE Bot 的相關範例程式碼的時候,通常都是沒有加上資料庫。但是有一些的範例程式碼其實有一些儲存資料會比較好。 所以這時候需要加上資料庫的相關讀寫。

當然…. 資料庫也是有窮人版的。由於許多服務都要對於他們的資料庫服務收費之後,這時候就需要有一些變通的方式。 使用記憶體當作資料庫的架設。

那如何讓你在程式碼中,只要寫一次關於資料處理方面,當你的部屬的環境變數有不同,就會使用不同的資料庫來存取呢?

比如說:

  • 當你有 PostGresSQL 的資料庫 URL ,就使用 PG SQL 相關處理方式。
  • 如果沒有的話,就使用記憶體做為資料庫。
  • 以後也可以增加不同的雲的部署方式。(或是支援 Firebase 相關資料庫)

這一篇文章將開始敘述,如何透過 Golang 的 Interfaces 的方式來達到類似繼承的效果。 使用同一份的程式邏輯程式碼,可以根據你設定的參數不同來讀取不同得資料庫。

範例程式碼 LINE Bot 群組聊天摘要生成器

這次透過上一次的範例文章 [學習文件] LINE Bot 群組聊天摘要生成器 作為一個範例程式碼。 先來看整體切割方式。

Github Repo: https://github.com/kkdai/LINE-Bot-ChatSummarizer

## 資料架構切割圖

image-20230113221237698

所有的 implement 都是透過 Data 也就是之後 Basic Class 的 API 來存取相關資料。 只要建立的時候,使用相關的 Interfaces 搭配不同的起始變數就可以呼叫同樣的處理資訊。

先列出相關的處理程式碼:

相關處理程式碼

這裡使用到定義成 Interfaces 的 GroupDB 的實作,根據不同的設定 NewPGSql(url) 或是 NewMemDB() 就可以讓裡面對應的實作不同。

詳細列出不同資料庫的開發方式

接下來列出不同資料庫的實作方式。

Basic (Data)

這是最基礎的設定,最重要記事 interface GroupDB 的宣告,然後其他兩個也必須要有

  • ReadGroupInfo(string) GroupData
  • AppendGroupInfo(string, MsgDetail)

兩個 function 的實作,並且輸入參數跟輸出參數都要相同。 這樣才能使用到一樣的邏輯來操作資料。

Memory DB

接下來這是使用 Memory 做為資料庫的實作,可以看到主要是透過 map 來操作相關資料處理。 這樣透過 memory 當作 DB 的方式,如果是在 FAAS (e.g. Heroku 或是 Render.com) 就會在服務睡眠的時候,失去你的儲存資料。

PostGresSQL DB

接下來這邊就是使用 PostGresSQL 的實作,主要是透過 "github.com/go-pg/pg/v10" 這個套件的版本,可以透過 ORM 的方式直接去操作 PostgresSQL 可以讓許多實情省下麻煩。但是很多時候,沒有直接使用 SQL 其實也是更加的麻煩。

這邊的開發流程上,沒有要注意的事情。只需要注意到必須以下實作就好。

  • ReadGroupInfo(string) GroupData
  • AppendGroupInfo(string, MsgDetail)

img

未來發展

透過 Interfaces 來當作資料庫存取的開發方式可以很方便,並且留下未來許多資料庫的資源空間。不論是支援 MongoDB 或是想要使用 MySQL 甚至是整個資料庫搬到 FireStore 也不需要改動我原版的商業邏輯部分。 只需要把基本的資料庫實作完成即可。

希望這篇文章可以給大家一些想法。


Buy Me A Coffee

Evan

Attitude is everything