串接 Firebase 数据库 (3)
阅读“建立 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 云端数据库的能力,不仅能存取数据,更能透过即时推播的功能,将更新的数据推播到网页里,做出相当方便的应用!
参考
微信扫码关注
抖音扫码关注