こんにちは、ゲームソリューション部のsoraです。
今回は、Cloud Functions for Firebase(Python)でFirestoreにあるデータを取得してみたことについて書いていきます。
Firebase SDKを使ったFlutterでのリクエストではなく、HTTPリクエストで取得します。
個人的につまづいたポイントがあったため、そのポイントについては最後に記載します。
Firestoreにてデータベースの作成
まずはFirebaseのドキュメントDBであるFirestoreを作成します。
DB名は(default)
のままで、リージョンは作成予定のFunctionsと同じasia-northeast1(Tokyo)
にします。
モードはテスト用でそのまま接続できるようにしたいため、テストモードにしました。
Firestoreでは、DBの中にコレクションがあって、その配下にドキュメントをあります。
ドキュメントの配下には(サブ)コレクションとフィールドを追加することができます。
コレクション>ドキュメント>フィールド
やコレクション>ドキュメント>サブコレクション>ドキュメント>フィールド
みたいな構成になります。
今回登録したデータは以下です。
コードの解説
コードは以下です。
先ほど作成したFirestoreのusersコレクションのデータを取得するコードになっています。
リージョンはasia-northeast1(Tokyo)
にしています。
解説はコメント内に記述しています。
今回はget()
していますが、set()
やdelete()
なども可能です。
main.py
import json
from firebase_functions import https_fn, options
from firebase_admin import initialize_app, firestore
# 新しいAppインスタンスを初期化
initialize_app()
# リージョンの指定
options.set_global_options(region=options.SupportedRegion.ASIA_NORTHEAST1)
@https_fn.on_request()
def test_firestore(req: https_fn.Request) -> https_fn.Response:
db = firestore.client()
# Firestoreからデータの取得
# .document('documentName')を追記してドキュメント内のデータ取得も可能
# オブジェクトレベルで指定しての取得は不可
chat_count = db.collection('users')
docs = chat_count.get()
# docsをそのままreturnするとエラーになるため、辞書型へ変換する
users_list = []
for doc in docs:
users_list.append(doc.to_dict())
# ASCII エンコード以外の文字列をエスケープせずにそのまま出力
users_documents = json.dumps({"users": users_list}, ensure_ascii=False)
return users_documents
デプロイ・実行確認
コードが完成したためデプロイします。
今回はFunctionsをローカルで実行していますが、Firebaseへのデプロイをしても同様に動作すると思います。
# ローカルで実行
firebase serve --only functions:test_firestore
# デプロイする場合
firebase deploy --only functions:test_firestore
コマンド実行時に表示されるURLにアクセスすると、以下のようにFirestoreに登録したusers
コレクションのデータが表示できました。
個人的に詰まったこと
Firestoreにてデータベースを作成時に、データベース名を(default)
ではなく別名にしてみたところ、データベースの指定が上手くできずに接続できませんでした。
色々調べたり試行錯誤してみたものの接続できなかったため、別名で利用したくなった時はまた調べてみようと思います。(できなくはないと思うため)
ちなみに、Firebaseにて無料割り当ての対象となるのは、データベース名が(default)
の場合のみです。
使用量と上限 | Firestore | Firebase
最後に
今回は、Cloud Functions for Firebase(Python)でFirestoreにあるデータを取得してみたことを記事にしました。
どなたかの参考になると幸いです。