Python Tips: Python で Firestore のデータを CSV 形式でエクスポートしたい

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 Admin SDK

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 にしました: