firebaseのCloudFireStoreの使い方 (Python3編)

Firebaseに「Cloud Firestore」のβ版が追加されてpythonで試してみましたので、情報を共有します。
以下に実践方法を記載していきます。

# 使うまでの流れ
0. 実施環境の確認 (開発環境)
1. [Firebase] Cloud Firestoreの初期設定
2. GoogleCloudPlatformで証明書を作成
3. macに証明書を紐づける
4. pythonのライブラリを導入
5. Cloud Firestoreへの書き込みおよび読み込み実践

# 実施環境の確認
#### マシン環境
　・ mac
　・ python : 3.6.2(pipが入っていること)
#### アカウント
　・ Firebaseを持っていること
　　(もしアカウントを所持していなければ作ってください)

# [Firebase] Cloud Firestoreの初期設定
##### **FirebaseのDatabaseコンソール画面**
FirebaseのDatabaseコンソール画面に遷移すると下記に示す画面が表示されます。
今回は未設定を想定しているので設定前の画面に表示されている「FIRESOTRE ベータ版を試してみる」をクリックしてCloud Firestoreを作成および初期設定を行います。

**[設定前の場合]**
<img width="1792" alt="firebase02.png" src="https://qiita-image-store.s3.amazonaws.com/0/56169/2e4b96b9-8846-771f-f6a8-52cb05fa0f50.png">
**[設定後のDatabaseコンソール画面]**
<img width="1498" alt="firebase12.png" src="https://qiita-image-store.s3.amazonaws.com/0/56169/1c2e9d2a-8b77-41a6-d9a6-5d8809c96533.png">

## **Cloud Firestoreの初期設定画面**
「FIRESOTRE ベータ版を試してみる」をクリック後、画面にはポップアップが表示される。
このポップアップ画面はセキュリティルールの初期設定をする箇所です。

###### **設定内容**
 「テストモードで開始」を選択して「有効にする」ボタンを押下してください。

###### **選択内容**
　・ ロックモードで開始 : 初期設定時は書き読み込みが行えない状態(作成後に自身でルール設定を行う必要有)
　・ テストモードで開始 : テストしたい人向け。誰からでも覗かれる可能性があるので注意!

**[ルール設定]**
<img width="1792" alt="firebase03.png" src="https://qiita-image-store.s3.amazonaws.com/0/56169/f887f8ec-ea4f-a229-8558-28afbfc9f62d.png">

**[有効にするボタン押下後の構築待機画面]**
1-2分待ちます
<img width="1792" alt="firebase04.png" src="https://qiita-image-store.s3.amazonaws.com/0/56169/fa33d4a9-79e1-8de1-3dea-db7b3171fd7c.png">

**[Cloud Firestore　構築後の画面]**
構築が終わるとCloud Firestoreのコンソール画面に遷移される。
初期時は何も設定がされていないため空の状態が表示されています。

<img width="1792" alt="firebase05.png" src="https://qiita-image-store.s3.amazonaws.com/0/56169/50219f94-758a-dbf4-2b11-791618f75484.png">

# GoogleCloudPlatformで証明書を作成
pythonでCloud Firestoreを利用するには証明書が必要になるため、
以下のリンクから GoogleCloudplatformのコンソール画面に証明書を作成していきます。
（僕が他のやり方をしらないだけかもしれません)

https://console.cloud.google.com/apis/credentials

## GoogleCloudPlatform画面 プロジェクトの設定
遷移すると以下の画面が表示されます。
プロジェクトが未設定であるので左上の「プロジェクトを選択プロダウン」または中央の「選択」ボタンを押下してください。
押した後にプロジェクト選択ポップアップが表示されます。
この時に複数表示されていた場合はFirebaseで作成したプロジェクトを選択してください。

[リンクから移動した後に表示される画面]
<img width="1792" alt="firebase06.png" src="https://qiita-image-store.s3.amazonaws.com/0/56169/93b3b065-cbf9-7e55-46eb-822ac6fa93be.png">

[プロジェクトの選択画面の表示]
<img width="1792" alt="firebase07.png" src="https://qiita-image-store.s3.amazonaws.com/0/56169/766ea888-ce29-49c8-6a6c-14b7d026e87f.png">

<img width="1792" alt="firebase08.png" src="https://qiita-image-store.s3.amazonaws.com/0/56169/ccf70103-f91d-d242-7cb7-d163c9ad97a8.png">

## GoogleCloudPlatform画面 証明書の作成
1. プロジェクト選択後に左メニューの認証情報を選択し認証情報を作成できる画面が表示されます。
2. 認証情報画面に表示される「認証情報を作成」プルダウンを押下し、プロダウン上に表示される「サービス アカウント キー」を選択して「サービス アカウント キー作成画面」に遷移します。
3. 「サービス アカウント キー作成画面」では「サービス アカウント」の選択、「キーのタイプ」を選択してください。選択内容は以下に記載します。
4. 選択後は「作成」を押下し、jsonファイルをダウンロードします。

■ 選択内容
 ・ 「サービス アカウント」　： firebase-adminsdk
 ・ 「キータイプ」 : json

**[認証情報画面]**
<img width="1792" alt="firebase09.png" src="https://qiita-image-store.s3.amazonaws.com/0/56169/1f12b294-75e8-2e01-385c-78c4fbdfbde1.png">

![firebase10.png](https://qiita-image-store.s3.amazonaws.com/0/56169/274fd0e4-ab3d-1989-d94d-10a376499b10.png)


**[サービス アカウント キー作成画面]**
<img width="774" alt="firebase11.png" src="https://qiita-image-store.s3.amazonaws.com/0/56169/ae703b95-149e-6992-59b8-1bd96d75fd10.png">

## macに証明書を紐づける
macに証明書のパスを覚えさせていきます。
証明書のパスを取得して以下のコマンドを実行してください
パスは絶対パスで実施してください。

``` terminal
> export GOOGLE_APPLICATION_CREDENTIALS="/.../[証明書のファイル名].json"
```

## pythonのライブラリを導入
google-cloudライブラリを利用していきます。
[ドキュメント](https://googlecloudplatform.github.io/google-cloud-python/)

``` terminal
> pip install --upgrade google-cloud
```

## Cloud Firestoreへの書き込みおよび読み込み実践
以下のコードを実行するとCloud Firestoreへの書き込み、読み込みを実施します。


``` main.py
# ライブラリの読み込み
from google.cloud import firestore

if __name__ == '__main__':


    # dbへの接続
    db = firestore.Client()

    ###########################
    # Write
    ###########################
    # コレクションの指定 : collection(u'users')
    # コレクションに紐づくドキュメントの指定 : document(u'alovelace')
    doc_ref = db.collection(u'users3').document(u'alovelace')

    # ドキュメントへの書き込み
    doc_ref.set({
        u'first': u'Ada',
        u'last': u'Lovelace',
        u'born': 1815
    })

    ###########################
    # Read
    ###########################
    users_ref = db.collection(u'users')
    docs = users_ref.get()
    for doc in docs:
        print(u'{} => {}'.format(doc.id, doc.to_dict()))

```

**[Firebase Firestore画面]**
userが追加されていることがわかります。
![firebase14.png](https://qiita-image-store.s3.amazonaws.com/0/56169/800bbcce-3ffb-4ed6-8e0a-8d63e180f807.png)


## 所感
Cloud Firestoreを少しいじってみて以「Realtime Database」よりも使いやすいと実感しました。
以前のFirebaseは「Realtime Database」のみでデータを管理しなければいけなく、sampleデータを作るのにもぽちぽち画面を押して
作り間違えたら一から作らなければ行けませんでした。
しかし、このCloud Firestoreはフォルダやファイルといった考え方で作られており、人間が直感的にデータをいじれるようになったと実感してます。

終わり。