firestore 是 google 所提供的雲端文件式資料庫服務,為各種開發工具提供了方便使用的 sdk,python 的套件名稱為 firebase-admin,用 pip 安裝後就可操作了。
pip install firebase-admin
這種安裝套件的工作只需要在專案開發初期執行一次,之後一段時間就忘了它的存在了,非常需要記錄起來。
以下程式執行初始化和授權,放在模組開頭:
import firebase_admin
import firebase_admin.firestore
cred = firebase_admin.credentials.Certificate(
'newservice/firestoreServiceAccountKey.json')
fireApp = firebase_admin.initialize_app(cred)
dbClient = firebase_admin.firestore.client()
其中「授權」的程序也是很容易忘記的,又耗費了許多力氣去回想,必須在 google cloud console IAM 管理介面,新增 service account,並匯出私鑰檔案 (xxx.json) 存在專案目錄備用,參閱「quick start」文件。
可先用 google 提供的管理介面手動新增一些資料測試使用,介面功能非常簡單直覺:
已知 collection 和 document id,可用三行取得資料:
symbolsRef = dbClient.collection(u'symbols')
docRef = symbolsRef.document('6533.TW')
obj = docRef.get().to_dict()
# 若要檢查資料存不存在,可用以下判斷式,讓流程嚴謹,避免程式錯誤跳開。
if docRef.get().exists:
obj = docRef.get().to_dict()
取得整個 collection
objs = []
for docRef in symbolsRef.stream(): # symbolsRef.get() 也可以
objs.append(docRef.to_dict())
objs
加上一些查詢條件,或是排序
symbolsRef = dbClient.collection(u'symbols')
queryRef = symbolsRef.where("symbol", "==", "6533.TW")
objs = []
for docRef in queryRef.get():
objs.append(docRef.to_dict())
objs
# order 的寫法如下,正序倒序,取前面幾筆或後面幾筆都沒問題
queryRef = symbolsRef.order_by('symbol',
direction = firebase_admin.firestore.Query.DESCENDING).limit(1)
queryRef = alertRef.order_by('alertId').limit_to_last(1)
已知 collection 和 document id,要把 field1 欄位值修改成 value1,也只要三行,若 field1 不存在也沒關係,該筆資料會新增此欄位;另外也可一次傳入多欄位。
symbolsRef = dbClient.collection(u'symbols')
docRef = symbolsRef.document('6533.TW')
docRef.update({'filed1':'value1'})
# 刪除文件
symbolsRef = dbClient.collection(u'symbols')
docRef = symbolsRef.document('6533.TW')
docRef.delete()
# 只刪除文件中的某個欄位
docRef.update({'filed1':firestore.DELETE_FIELD})
# 新增一筆資料,由系統自動賦予 id
symbolsRef = dbClient.collection(u'symbols')
symbolsRef.add({'field1': 'value1'})
# 新增一筆資料,由程式指定 id,則要用 set 方法
# 若該 id 的文件已經存在,則整筆資料將被取代
symbolsRef = dbClient.collection(u'symbols')
symbolsRef.document('id1').set({'field1': 'value1'})
by Newman 2023/12/26
導覽頁:紐曼的技術筆記-索引
References: