為聊天機器人連結資料庫

Chatbot學習筆記-Day3

Jason Tsai
5 min readAug 26, 2021

經過Day2的努力,我們的Linebot已經成功進化為搜圖小幫手。但若要與使用者有更好的互動,肯定必須記住使用者所輸入的一些資訊。

這種時候,就會想到「Heroku搞不好有提供資料庫的服務!」

為Linebot添加PostgreSQL

PostgreSQL是Heroku所提供的資料庫,要將它裝在我們的Linebot上可說是相當容易。

首先登入Heroku後,在"Overview"的地方找到"Configure Add-ons":

圖一 Heroku Configure Add-ons

點擊之後,可以在"Add-ons"的搜尋欄輸入"PostgreSQL"。

在選擇方案後按下"Submit Order Form"。

圖二 輸入Heroku Postgres
圖三 選擇Hobby Dev方案

因為用量不大,所以選擇免費的"Hobby Dev— Free"方案,而這免費方案呢則有以下限制:

  1. 最多儲存 10,000 筆資料
  2. 最大同時連線數量為20筆
  3. 每個月最多 4 個小時的停機時間
圖四 資料庫添加完成

完成後再返回首頁,就可以看到成功掛載Heroku Postgres的圖示囉。

Python連接PostgreSQL

那問題又來了,Python該如何操作PostgreSQL呢?

"psycopg2"模組可以!快速、穩定的特性是我們串接資料庫的最佳幫手。

Create Table

要操作資料庫,首先當然要創建一個table來存放資料。psycopg2創建table的語法如下:

圖五 創建資料表的程式碼
  • Line 4 : 取得Heroku Database的位置
  • Line 7 : 透過"psycopg2"與Database連線
  • Line 8 : 創建"cursor"的實例
  • Line 11 : 建立table的SQL
  • Line 21 : 執行SQL
  • Line 22 : 要透過commit SQL才會真正進行

這邊創立了一個名為"test_table"的table,維度分別是id(primary key)、name、weight、height以及date,可以用來儲存基本資料以及紀錄日期。

Insert data

建立完table後肯定需要給它一些資料對吧!那麼,就直接貼上語法:

圖六 匯入資料的程式碼
  • Line 6 : 以"tuple"裝入需資料
  • Line 8 : 在Database添加資料的SQL
  • Line 10 : 執行SQL並給上要匯入的資料為引數
  • Line 13 : 計算總共匯入多少筆資料並在下一行印出

一次匯入多筆資料

如果要一次匯入多筆資料,可以使用"executemany"函式,節省時間也更加的有效率。

圖七 匯入多筆資料的程式碼
  • Line 6 : 用"list"將多個"tuple"包起
  • Line 17 :可以發現原本的'execute"變成"executemany"了,相當直觀。

Select data

要怎麼確認我們有沒有正確的將資料匯入Database呢?

可以透過撰寫SQL,依照條件將資料拿出來看看:

圖八 查詢資料的程式碼
  • Line 6 : 查詢資料的SQL
  • Line 9 : 將SQL找到的所有資料取出
圖九 output

Update data

如果資料key錯了也不用擔心,我們一樣可以利用SQL來更新資料:

圖十 更新資料的程式碼
  • Line 6 : 更新後的內容
  • Line 7 : 被取代的資料
  • Line 8 : 將原本的"David"取代為"Danny"
  • Line 10 : 將"new"和"origin"兩個引數投入並做更新

看一下結果如何:

圖十一 output

Delete data

最後一步就是刪除資料了,用不到的資料無適時刪除也會造成空間浪費,那就來看看刪除的語法是如何吧。

圖十二 刪除資料的程式碼
  • Line 6 : 刪除"id"大於5的資料
  • Line 12 : 計算被刪除的資料筆數

透過"psycopg2"模組操作資料庫的基本語法就練習完畢了,程式碼的部分可以在這邊找到。

明天打算將這些程式碼加入Linebot的app當中,這樣我們的Linebot就能夠更人性化的記住使用者資料並做互動囉。

--

--

Jason Tsai

Data Analyst in financial industry with experience as Tableau consultant and DA at Martech field.