串接 Firebase RealTime Database 存取資料
閱讀「建立 Firebase RealTime Database」和「設定 Firebase RealTime Database 安全規則」兩篇教學後,接下來就可以透過 Python 的 python-firebase 函式庫,實現串接 Firebase RealTime Database 的功能。
快速導覽:
本篇使用的 Python 版本為 3.8.10,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
安裝 python-firebase 函式庫
參考 Firebase 官方文件「Installation & Setup for REST API」,使用 Özgür Vatansever 的 python-firebase 函式庫,就能透過 REST API 進行資料的存取,但由於當初作者在發布函式庫時有問題,所以不能直接進行安裝 ( 會出現錯誤 ),因此要輸入下方安裝指令進行安裝 ( 有些 MacOS 作業系統會有問題,需要使用 xcode-select --install
更新 XCode 才能順利安裝 )。
pip install git+https://github.com/ozgur/python-firebase
Firebase RealTime Database 規則設定
進入「規則」頁籤,將規則修改成任何人都能讀取和寫入 ( 更多規則設定參考:設定 Firebase RealTime Database 安全規則 )。
{
"rules": {
".read": true,
".write": true
}
}
存取資料的方法
安裝 python-firebase 函式庫後,就可以使用下列存取資料的方法:
方法 | 參數 | 說明 |
---|---|---|
put() | url, name, data | 增加指定節點 ( 鍵 ) 的資料。 |
post() | url, data | 增加資料 ( 節點會自動產生 )。 |
get() | url, name | 讀取指定節點 ( 鍵 ) 的資料。 |
delete() | url, name | 刪除指定節點 ( 鍵 ) 的資料。 |
除了上述「同步」的方法,也可以使用「非同步」的方法存取資料,取出資料後執行 callback 函式內容:
方法 | 參數 | 說明 |
---|---|---|
put_async() | url, name, data, callback | 使用非同步的方式增加指定節點 ( 鍵 ) 的資料。 |
post_async() | url, data, callback | 使用非同步的方式增加資料 ( 節點會自動產生 )。 |
get_async() | url, name, callback | 使用非同步的方式讀取指定節點 ( 鍵 ) 的資料。 |
delete_async() | url, name, callback | 使用非同步的方式刪除指定節點名稱 ( 鍵 ) 的資料。 |
put() 增加指定節點的資料
put() 方法可以增加指定節點名稱的資料,如果根目錄裡已經存在該名稱的節點,則會替換該節點裡的所有內容,put() 方法包含三個必要參數:
參數 | 說明 |
---|---|
url | 從根目錄開始的資料庫網址,例如 '/' 或 '/oxxo/' 。 |
name | 節點名稱 ( 鍵 )。 |
data | 存入的資料,可以是數字、文字、串列或字典格式,串列儲存後會被替換成字典 ( 使用索引值做為鍵 ),字典儲存後會根據鍵與值產生資料的樹狀結構。 |
下面的程式碼執行後,會在根目錄裡建立 oxxo 節點,值為 123。
from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None) # 初始化,第二個參數作用在負責使用者登入資訊,通常設定為 None
fdb.put('/','oxxo',123)
下面的程式碼執行後,會在根目錄的 test 節點裡,裡建立 oxxo 節點,值為 123 ( 如果沒有 test 節點,會自動產生一個 test 節點 )。
from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
fdb.put('/test','oxxo',123)
下面的程式碼執行後,會在根目錄裡建立 oxxo 節點,並使用字典格式增加其中的樹狀結構內容。
from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
fdb.put('/','oxxo',{'apple':100, 'orange':200})
下面的程式碼執行後,會在根目錄裡建立 oxxo 節點,添加的串列格式內容會被轉換成字典格式的樹狀結構。
from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
fdb.put('/','oxxo',[123,456,789])
post() 增加資料
post() 方法可以直接在指定的目錄中增加資料,資料會放在一個自動產生的節點中,post() 方法包含兩個必要參數:
參數 | 說明 |
---|---|
url | 從根目錄開始的資料庫網址,例如 '/' 或 '/oxxo/' 。 |
data | 存入的資料,可以是數字、文字、串列或字典格式,串列儲存後會被替換成字典 ( 使用索引值做為鍵 ),字典儲存後會根據鍵與值產生資料的樹狀結構。 |
下面的程式碼執行後,會在根目錄加入一個 123 的值。
from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
fdb.post('/',123)
下面的程式碼執行後,會在根目錄裡的 oxxo 節點中加入一個 123 的值。
from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
fdb.post('/oxxo',123)
下面的程式碼執行後,會在根目錄裡使用字典格式增加其中的樹狀結構內容。
from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
fdb.post('/',{'apple':100, 'orange':200})
get() 讀取指定節點的資料
get() 方法可以讀取指定節點的資料,包含兩個必要參數:
參數 | 說明 |
---|---|
url | 從根目錄開始的資料庫網址,例如 '/' 或 '/oxxo/' 。 |
name | 節點名稱 ( 鍵 ),設定 None 可取得該節點所有資料。 |
以下圖的資料庫為例,資料庫中包含 fruit 和 oxxo 兩個節點。
執行下方程式碼,就會取得 oxxo 節點裡的資料。
from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
result = fdb.get('/','oxxo')
print(result) # 123
下方的程式碼執行後,則會取得 fruit 裡 apple 節點的資料。
from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
result = fdb.get('/fruit','apple')
print(result)
將 name 參數設為 None,就能取得某個節點裡的所有資料,以下方的程式碼為例,就會取出根目錄裡所有資料,也由於資料使用字典格式,所以就能透過讀取字典的方式進行取值。
from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
result = fdb.get('/', None)
print(result) # {'fruit': {'apple': 100, 'orange': 200}, 'oxxo': 123}
print(result['fruit']['apple']) # 100
delete() 刪除指定節點的資料
delete() 方法可以刪除指定節點的資料,包含兩個必要參數:
參數 | 說明 |
---|---|
url | 從根目錄開始的資料庫網址,例如 '/' 或 '/oxxo/' 。 |
name | 節點名稱 ( 鍵 ),設定 None 可刪除該節點所有資料。 |
執行下方程式碼,就會刪除 oxxo 節點裡的資料。
from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
fdb.delete('/', 'oxxo')
將 name 參數設為 None,就能刪除某個節點裡的所有資料,以下方的程式碼為例,執行後就會刪除根目錄裡所有的資料 ( 等同清空資料庫 )。
from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
fdb.delete('/', None)
put_async() 使用非同步的方式增加指定節點的資料
put_async() 方法和 put() 方法相同,都可以增加指定節點的資料,但是 put_async() 是使用「非同步」的方式取得資料後,取得資料後還可以透過 callback 函式處理資料,以下方的程式碼為例,第一個 for 迴圈使用「同步」的 put() 方法,所以每次取值都需要「排隊」,然而第二個 for 迴圈裡的 put_async() 則不需要排隊,執行後觀察存檔的時間,會發現 put_async() 幾乎沒有什麼延遲。
from firebase import firebase
import time
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
for i in range(10):
fdb.put('/', f'a{i}', time.time())
for i in range(10):
fdb.put_async('/', f'b{i}', time.time())
搭配 callback 函式,就能在資料存入後執行特定的動作。
from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
def oxxo_callback(response):
print('ok')
fdb.put_async('/', 'oxxo', 123, oxxo_callback) # ok
post_async() 使用非同步的方式增加資料
post_async() 方法和 post() 方法相同,都可以增加指定節點的資料,但是 post_async() 是使用「非同步」的方式取得資料後,取得資料後還可以透過 callback 函式處理資料,以下方的程式碼為例,第一個 for 迴圈使用「同步」的 post() 方法,所以每次取值都需要「排隊」,然而第二個 for 迴圈裡的 post_async() 則不需要排隊,執行後觀察存檔的時間,會發現 post_async() 幾乎沒有什麼延遲。
from firebase import firebase
import time
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
for i in range(10):
fdb.post('/', time.time())
for i in range(10):
fdb.post_async('/', time.time())
搭配 callback 函式,就能在資料存入後執行特定的動作。
from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
def oxxo_callback(response):
print('ok')
fdb.post_async('/', 123, oxxo_callback) # ok
小結
如果可以透過 Python 串接 Firebase Realtime database,就能大幅發揮 Firebaase Realtime database 雲端資料庫的能力,不僅能存取資料,更能透過即時推播的功能,將更新的資料推播到網頁裡,做出相當方便的應用!
參考
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~