2022年1月5日 星期三

Python 學習筆記 : Firebase 即時資料庫 (一)

Firebase 創立於 2011 年 9 月, 是專為行動 App 開發者提供的 BAAS (Backend As A Service) 雲端服務平台, 主要產品 Firebase 即時資料庫是以 JSON 格式儲存的 NoSQL 資料庫, 可與 Python 字典的鍵值對資料型態完美匹配. Firebase 公司於 2014 年被 Google 收購, 並與旗下之 Google Cloud 雲端服務整合, 為行動與 Web 開發者提供一站式整體解決方案, 將複雜之技術細節包裝起來, 使開發者專注於使用者需求, 以利快速開發出高品質之應用. 因此 Firebase 不再只是一個即時雲端資料庫系統, 而是一個行動 App 服務平台 (Platform), 參考 :

NoSQL 與傳統之關聯式資料庫迴然不同, 不需事先定義資料表與欄位. Firebase 特殊之處在於即時, 資料可已在所有客戶端之間即時同步, 設計者可設定監聽事件, 當資料庫中的資料變動時會向應用程式發出訊息, 讓應用程式可據此馬上做出回應. 與傳統的 Request-Response 模式不同的是, Firebase 資料庫的同步機制可在數毫秒內與所有相連此外 Firebase 並與 AdMob, AdWords 等服務結合以擴增使用者層面, 參考官網介紹 :

Firebase 提供免費的 Spark 方案與付費的 Blaze 方案 (依量實支實付, pay as you go), Firebase 提供線上費用計算器供開發者估算所需費用. 免費方案則有如下連線數與流量容量限制 :
  • 連線 : 同時 100 個
  • 容量 : 1 GB
  • 流量 : 每月10 GB
  • 檔案 : 每日 50KB (讀取), 20KB (寫入, 刪除)
對一般流量不大或開發中的應用而言免費方案即綽綽有餘. 





Firebase 支援 Android, iOS, 與 Web 等相應的 API 函式庫, 教學文件參考 :

https://firebase.google.com/docs/guides

參考書籍 : 

超簡單 Python/MicroPython 物聯網應用 (博碩, 陳會安, 2021) 第 13-3 節


一. 新增專案 : 

一個專案代表一個資料庫, 在建立資料庫之前須先新增一個專案 (一個帳戶下可以建立多個專案, 也就是多個資料庫). 由於 Firebase 已被 Goolge 併購整合, 故只要有 Google 帳號即可在登入後使用 Firebase, 首先連線 Firebase 網站 :




按 "Get started" 鈕會進入 Google 登入頁面  :



登入成功後會進入專案管理頁面 : 




此頁面會以按鈕形式列出已建立之 Firebase 專案, 若尚未建立過專案, 則只有 "新增專案" 一個按鈕, 按此新增一個專案 :





在 "專案名稱" 欄填入專案名稱, 若名稱已被別人使用, 則底下會顯示建議的專案 ID, 通常是在想要的名稱後面添加幾個隨機字元, 可點那枝筆去編輯. 這個專案 ID 是 App 或應用程式用來辨認資料庫用的唯一識別, 不可重複, 此處填入 tony1966test 後上下一致表示此 ID 尚無人使用. 按 "繼續" 進入步驟 2 設定是否加入 Google Analytics : 




採用預設設定按 "繼續" 即可 : 




此處只要從下拉式選單中選擇一個 Google 帳戶, 按 "建立專案" 鈕就會開始建立專案 : 





按 "繼續" 鈕即進入此專案的管理儀表板 (Dashboard) 頁面 : 





二. 建立資料庫 : 

建立專案後就可以在此專案下面建立 NoSQL 資料庫, 點選儀表板左方的 "Realtime Database", 再按右方框內的 "建立資料庫" 鈕會彈出資料庫設定頁面 :  





即時資料庫預設位置為美國中部, 亞洲地區可選擇較近的新加坡, 選好後按 "下一步" 進入安全性規則設定頁面 (即讀寫權限控管模式設定) :




預設是 "以鎖定模式啟動", 此模式下對資料庫的存取將受到安全性規則的限制, 此處先改為 "以測試模式啟動", 此模式會讓所有使用者在未來 30 天內均擁有讀寫刪除資料庫的權限. 按 "啟用" 即建立資料庫, 並顯示 Firebase 資料庫主控台頁面 : 




主控台頁面預設顯示在 "資料" 頁籤, 可在此處手動操作資料庫 (新增, 編輯, 或刪除鍵值資料). 首先切換到控制台頁面上方的 "規則" 頁籤會顯示目前的安全性規則 : 





如果要讓所有使用者永遠可讀寫此資料庫 (例如即時通訊 App 資料庫), 可在下方編輯器中將規則中的兩個鍵 .read 與 .write 都改成 true :

{
  "rules": {
    ".read": true,  
    ".write": true, 
  }
}

然後按 "發布" 鈕更改設定 : 




如果 App 只允許一般使用者讀取, 不允許寫入, 安全性規則要改為如下 :

{
  "rules": {
    ".read": true,  
    ".write": false
  }
}

如果只允許 Google 登入者寫入, 則規則要設為如下 : 

{
  "rules": {
    ".read": true,  
    ".write": "auth !== null"
  }
}

這樣就完成資料庫的設定, 可以開始新增資料到 NoSQL 資料庫裡面了. 


三. 新增與刪除資料 : 

在 Firebase 即時資料庫主控台頁面切回 "資料" 頁籤即可進行線上資料庫操作 : 




主控台 "資料" 頁籤最上方是 App 的網址, 這個 URL 在使用 Python 或網頁存取 Firease 資料庫時會用到. 下方是專案 (資料庫) 名稱, 按後面的 + 鈕可在此資料庫下新增 key-value 資料, 在 "名稱" 欄輸入 key, 在 "值" 欄輸入 value, 再按 "新增" 即可, 例如 : 





這樣就在 tony1966test 資料庫下新增一筆鍵值對資料了, 但這資料是直接放在資料庫根目錄底下, 也可以用樹狀 JSON 結構來儲存資料, 亦即先在根目錄下輸入一個 key (類似檔案系統的子目錄或關聯式資料庫中的資料表), 但不輸入值, 而是按 "值" 欄後面的 + 鈕, 這樣會在此 key 底下出現建值對輸入框可新增鍵值對, 例如 : 






可見在 motto 鍵下已經新增了 key=motto1 的資料了. 如果要在此鍵下輸入第二筆資料, 可將滑鼠移到 motto 鍵上, 按後面的 + 鈕輸入第二筆鍵值對即可 : 





以上就是手動新增鍵值對資料的方法. 若要刪除資料只要將滑鼠移到該筆資料上, 再按出現在後面的 x 鈕即可. 注意, 線上操作只能新增與刪除資料, 無法直接編輯資料, 若要修改某筆資料的值, 只要新增一筆 key 一樣的資料就會蓋掉原來的資料, 與編輯功能一樣.


四. 匯出資料庫 : 

即時資料庫可匯出成 JSON 檔案下載保存, 在主控台頁面按右上角的垂直三點按鈕, 然後在彈出選單中點選 "匯出 JSON" 後按 "另存新檔" :





用記事本開啟所下載的 tony1966test-default-rtdb-export.json 檔案內容如下 : 




可見這是一個標準的 JSON 格式檔案 :

{
  "motto" : {
    "motto1" : "處事宜帶春風, 律己宜帶秋氣 (林則徐)",
    "motto2" : "物質生活向下看, 精神生活向上看 (胡適)"
  },
  "motto1" : "處事宜帶春風, 律己宜帶秋氣 (林則徐)"
}


五. 匯出資料庫 : 

外部 JSON 檔案可以直接匯入資料庫, 這對資料庫轉移 (例如將 MySQL 資料庫轉到 Firebase), 或資料庫備份很方便 (匯出保存必要時再匯入). 首先線上操作資料庫, 點選根結點後面的 x 按鈕, 然後在彈出視窗中按 "刪除", 這會將目前資料庫內的所有資料全部刪除 : 





清空資料庫後, 按右上角的垂直三點按鈕, 然後在彈出選單中點選 "匯入 JSON", 接著於另一個彈出頁面中按 "瀏覽" 鈕選取上面匯出備份的 JSON 檔後按 "匯入" 鈕即可 :






可見匯入完成後原先的資料又回來了. 


沒有留言 :