Cloud Functions for Firebase(Python)でFirestoreにあるデータを取得してみた

2024.06.10

こんにちは、ゲームソリューション部の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にあるデータを取得してみたことを記事にしました。
どなたかの参考になると幸いです。