Python を使って Firestore のデータ( collection )を CSV 形式でエクスポートする方法をご紹介します。
今回はローカルマシンで実行することを想定していますが、コードに少し変更を加えれば Cloud Run 等で実行することも可能です。
準備
エクスポート処理を行うのに必要なものが 2 つあります。
firebase_admin
パッケージ- サービスアカウントキー
firebase_admin
パッケージ
firebase_admin
パッケージは pip
でインストールします。
python -m pip install firebase_admin
サービスアカウントキー
「サービスアカウントキー」というのは、 Google Cloud Platform (以下「 GCP 」)のサービスアカウントを利用するためのプライベートキーで、実体は .json
ファイルです。
記事執筆時点でサービスアカウントキーの入手方法は 2 通りあります。
- A) Firebase コンソールからダウンロードする
- B) GCP コンソールから生成してダウンロードする
どちらの方法でもできることは同じなので使い慣れた方を使えば OK です(かんたんなのは A の方です)。
A) Firebase コンソールからダウンロードする
Firebase のコンソール(= https://console.firebase.google.com )から対象のプロジェクトを開きます。 画面の「 Project settings → Service accounts 」を辿って「 Firebase Admin SDK 」のところで「 Generate new private key 」をクリックするとダウンロードできます( UI を日本語にしている方は日本語に読み替えてください)。
B) GCP コンソールから生成してダウンロードする
GCP のコンソール( https://console.cloud.google.com )から対象のプロジェクトを開いて、「 API & services → Credentials 」と辿って、「 Service Accounts 」の中から Firebase Admin SDK に対応したサービスアカウントを見つけます。
記事執筆時点では、 Firebase Admin SDK に対応したサービスアカウントは Email が firebase-adminsdk-ランダムな文字列@プロジェクト名.iam.gserviceaccount.com
というパターンのアカウントです。
その詳細ページを開きます。
サービスアカウントの詳細ページを開いたら、「 Keys 」のところの「 ADD KEY → Create new key 」でキーを生成して同時にダウンロードします。
サービスアカウントキーのファイル名は私がダウンロードしたときは プロジェクト名-firebase-privateKey.json
といった名前でした。
今回はわかりやすさのためにこのファイルを firebase-privateKey.json
にリネームしておきます。
サービスアカウントキーは外部にモレないように注意してください。 Git にコミットするのも NG です。
コーディングと実行
firebase_admin
パッケージとサービスアカウントキーが用意できたら実際のスクリプトを書いていきます。
たとえば、 messages
という名前のコレクションの各データが name
body
created
という 3 つのフィールドを持っている場合は次のように書けば OK です。
firestore2csv.py
:
"""Firestore コレクションを CSV 形式でエクスポートする"""
import csv
import sys
from pathlib import Path
from firebase_admin import credentials, firestore, initialize_app
CRED_FILE = Path(__name__).resolve().parent / 'firebase-privateKey.json'
COLLECTION_NAME = 'messages'
FIELDS = ['name', 'body', 'created']
DIRECTION = firestore.Query.DESCENDING
def main():
"""メイン関数"""
# Firebase クライアントを生成する
client = firebase_client(str(CRED_FILE))
# Firestore のコレクションを取得する
collection = client.collection(COLLECTION_NAME)
writer = csv_writer(sys.stdout, FIELDS)
writer.writeheader()
# コレクション内の各データをソートしてから 1 件ずつ取得・出力する
for snapshot in collection.order_by('created', direction=DIRECTION).get():
data = snapshot.to_dict()
writer.writerow(data)
def firebase_client(cred_file):
"""Firebase クライアントを生成する"""
cred = credentials.Certificate(cred_file)
app = initialize_app(credential=cred)
client = firestore.client(app=app)
return client
def csv_writer(file, fields):
"""CSV ライターを生成する"""
return csv.DictWriter(file, fields)
if __name__ == '__main__':
main()
このスクリプトを実行すると、標準出力に CSV 形式で Firestore の中身が出力されます。
CSV をファイルに保存したい場合は、実行時に標準出力をファイルにリダイレクトするか、 csv_writer()
に渡している sys.stdout
をファイルに差し替えれば OK です。
変数 CRED_FILE
の入っているファイルパスはダウンロードしたサービスアカウントキーのものに変更してください。
ちなみに、 colletion.order_by()
はデータの並び順を指定するための指定です。
並び順を特に気にしない場合は order_by()
を挟まず collection.get()
とすれば OK です。
スクリプトファイルを保存したら実行します。
$ python firestore2csv.py
name,body,created
...
Firestore に格納されたデータが標準出力に出力されれば成功です。
ということで、 Python を使って Firestore のデータを CSV 形式でエクスポートする方法についでした。
一般に Firestore のデータを扱うときは Python ではなく Node を使うことが多いと思うのですが、個人的には Python の方が直感的でかんたんだと感じます。
参考
Firestore と firebase_admin
の公式ドキュメントです:
本記事のスクリプトを Gist にしました: