人生なんて暇つぶし

Webエンジニアの雑記ブログ。技術の話題はDApps開発、NEMアプリ開発がメイン。

移転しました。

約3秒後に自動的にリダイレクトします。

Cloud FirestoreのデータをPythonで取得する

f:id:maroemon58:20180616153658p:plain

Cloud Firestoreに登録されているデータをPythonで取得する方法を紹介します。

環境

$ python -V
Python 3.5.2 :: Anaconda 4.2.0 (x86_64)

準備

ライブラリ

必要なライブラリをインストールします。

$ pip install firebase-admin
$ pip install google-cloud-firestore

認証ファイルをダウンロード

firebaseのコンソール画面を開きます。

Sign in - Google Accounts

プロジェクトの設定をクリックします。 f:id:maroemon58:20180616152619p:plain

サービスアカウントのタブを開きます。 f:id:maroemon58:20180616152631p:plain

Pythonにチェックをし、新しい秘密鍵の生成をクリックします。 f:id:maroemon58:20180616152645p:plain

秘密鍵(ファイル名:〜.json)がダウンロードできたか確認しましょう。

実装

usersコレクションのデータを取得してみます。 f:id:maroemon58:20180616152707p:plain

まずは必要なライブラリをインポートし、秘密鍵を読み込みます。

import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore

cred = credentials.Certificate("./〜.json") # ダウンロードした秘密鍵
firebase_admin.initialize_app(cred)

usersコレクションのデータを取得します。

db = firestore.client()
docs = db.collection('users').get()
for doc in docs:
    print(doc.to_dict())

条件を追加してデータを取得します。

query = db.collection('users').where('active', '==', True)
docs = query.get()
for doc in docs:
    print(doc.to_dict())

複数条件を設定します。

query = db.collection('users').where('active', '==', True).where('created_at', '>', datetime.datetime.now())
docs = query.get()
for doc in docs:
    print(doc.to_dict())

上記のように等価演算子(==)と範囲比較(<、<=、>、>=)を組み合わせる場合はカスタムインデックスを作成する必要があります。 インデックスを作成してない状態で実行するとエラーが発生します。

google.api_core.exceptions.FailedPrecondition: 400 The query requires an index. You can create it here: https://console.firebase.google.com/project/〜

表示されたURLに遷移するとインデックス作成画面に遷移しますので、そのままCreate indexをクリックしましょう。 f:id:maroemon58:20180616152726p:plain

まとめ

複合クエリの実行は癖ありますが、比較的簡単に実装できますね。ではまた。

twitter.com