とりあえずPythonでFireBase Cloud Firestoreを使ってみる

##はじめに
「とりあえず、PythonでFireBaseのCloud Firestoreを使ってみたい！」ということで、
FireBaseの[公式ドキュメント](https://firebase.google.com/docs/firestore/quickstart?authuser=0)に従いながら、基本的なところの「データの出入力」をやってみたときの手順を書きます。

##まずは...「プロジェクト」を作成しよう
>「プロジェクト」は、Firestoreをはじめ，Cloud Functions, Authentication, Hosting などのサービスを使うための"まとめるもの"です。
FireBaseで作成したプロジェクトは、GCPでも共通です。

それでは、プロジェクトを作っていきましょう。

まずは、[FireBase Console](https://console.firebase.google.com)に移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/d9fd48c0-479d-3366-653a-5fb754171797.png)
真ん中の方の「プロジェクトの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/fbce619d-5117-8618-1f98-79d844160aa4.png)
プロジェクトの名前を入力し、「続行」をクリックします。

手順2/3で「Google アナリティクス（Firebase プロジェクト向け）」の説明が出てくるので、有効にするかどうかはお好みで。(今回はオフにします。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/69df399d-37bd-45ea-e615-08791ef69b7b.png)

最後に「プロジェクトの作成」をクリックすると、自動的に作成作業が始まります。

少しすると、以下のように「新しいプロジェクトの準備ができました」と表示されるので、「続行」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/e8211f4a-7a70-78ed-d63a-a4512c1ea9ab.png)

そうすると、コンソールに画面が遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/ddf42586-47a4-5308-41e9-028446c5cee4.png)

これで、プロジェクトの作成が完了しました。

##Cloud Firestoreのデータベースを作成しよう
>Cloud Firestore では、"データ"を書き込んでいく"ドキュメント"、
ドキュメントをまとめておくための"コレクション"(フォルダーのようなもの)があります。
「データベース」は、コレクションを入れておくための"箱"です。

...。難しいですね。
よくわからない方は、ほかの方のとってもわかりやすい記事を見てみてくださいね！

それでは、まずデータベースを作成していきましょう。

左側のメニューから「Database」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/5a225ed2-d729-fc2b-85bd-7f378008ec20.png)
続いて「データベースの作成」をクリックします。

なんかダイアログが出てくるので、「テストモードで開始」を選択してから「次へ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/bc724924-ae20-623d-5b37-81ad28545063.png)
ロケーションの選択はそのままで、「完了」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/de4b52df-f8be-8086-2288-d05b59041015.png)

プロビジョニングとセキュリティの設定が終わると、自動的に以下の画面に遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/65d5bc91-878a-16de-2504-eb37a871a393.png)

これでデータベースの作成が完了しました。

##コレクションとドキュメントを作成しよう
それでは、データを流し込む準備をしましょう。

真ん中の方の「コレクションを開始」をクリックします。
なんかダイアログが出てくるので、「コレクションID」に任意の文字列(コレクションの名前)を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/162877ca-bc39-c7de-357b-b13bc2093863.png)

「ドキュメントID」は任意の文字列でもいいですし、「自動ID」をクリックすると、適当に割り当ててくれます。
「フィールド」は設定してもいいですが、データを入れていくと、勝手に生成してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/dcf6c3c6-3361-f186-0c22-1b40e953431e.png)

そうすると、コレクションとドキュメントを一気に作ってくれるので、これでデータを流し込む準備はおわりです。

##APIキーをもってこよう
最後に、PythonからFireBaseをいじるためのAPIキーを生成し，ダウンロードします。

左上の歯車マーク→「プロジェクトの設定」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/a23595b0-683b-fdec-beaa-b6bada51f78f.png)

続いて、「サービスアカウント」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/6703ac98-2a11-4903-dfdd-00dceef96f9c.png)

そのまま、「新しい秘密鍵の生成」をクリックし、「キーを生成」をクリックします。
Jsonファイルがダウンロードされるので、適当なところに保管してください。

#ではPythonだ！
ここからは一旦FireBaseを離れ、Python側の作業に入ります。
ここに書いているコードは、[公式ドキュメント](https://firebase.google.com/docs/firestore/quickstart)から引用し、一部を改変しています。
##ライブラリを入れよう
PythonからFireBaseをいじるためのライブラリがすでにできています。

```python
pip install firebase-admin
```
を実行し、FireBaseのライブラリをインストールします。

##まずは初期化しよう
Cloud Firestore SDK インスタンスを初期化します。

```python
import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore

cred = credentials.Certificate('秘密鍵のパスを書いてね.json')
firebase_admin.initialize_app(cred)

db = firestore.client()
```
これだけでSDKは初期化され、データの出入力が可能となります。

##じゃ、データを追加してみよう
それでは、前の手順で作成したデータベースにデータを追加してみましょう。
[公式ドキュメント](https://firebase.google.com/docs/firestore/quickstart)のサンプルをそのまま使います。
下のコードは、先ほどの初期化のコードの下に追記してくださいね！

```python
doc_ref = db.collection(u'users').document(u'alovelace')
doc_ref.set({
    u'first': u'Ada',
    u'last': u'Lovelace',
    u'born': 1815
})
```
>ちょっとした解説
`db.collection(u'users')`...データベース内のどのコレクションを指定するか
`.document(u'alovelace')`...前で指定したコレクション内の どのドキュメントを指定するか
`u'first': u'Ada',`..."first"フィールドに"Ada"という値を追加する

それでは実行してみましょう！

正しく実行されると、FireBase Console側ではこのような表示になっていると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/8d79e76c-c49b-314f-c7f6-cf0930a72dbc.png)


##今度はデータを読み取ってみよう
では、追加したデータを読み取ってみましょう。
ここでは、Pythonの出力ウィンドウにそのまま文字列を出力します。

初期化のコードの下に

```python
users_ref = db.collection(u'users')
docs = users_ref.stream()

for doc in docs:
    print(u'{} => {}'.format(doc.id, doc.to_dict()))
```
うまくいくと、次のように出力されるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/eeb140dc-0611-0c2c-90d5-49a1c3a2de9a.png)

##では、追加したデータを削除してみよう
最後に、データを削除してみましょう。

削除する前の構造は下のようになっていると思います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/8d79e76c-c49b-314f-c7f6-cf0930a72dbc.png)

追加したフィールドだけを削除するには

```python
city_ref = db.collection(u'users').document(u'alovelace')
city_ref.update({
    u'born': firestore.DELETE_FIELD
})
```
このコードでは、"born"フィールドを削除しています。

ドキュメントごと削除するには

```python
db.collection(u'users').document(u'alovelace').delete()
```

コレクションも削除するには

```python
def delete_collection(coll_ref, batch_size):
    docs = coll_ref.limit(batch_size).get()
    deleted = 0

    for doc in docs:
        print(u'Deleting doc {} => {}'.format(doc.id, doc.to_dict()))
        doc.reference.delete()
        deleted = deleted + 1

    if deleted >= batch_size:
        return delete_collection(coll_ref, batch_size)
```
(コレクションを削除するときは、すべてのドキュメントを取得し，削除する必要があります。)

以上で、基本的な操作は終わりになります。

##おわりに
読みにくい記事だったと思いますが，ここまで読んでくださりありがとうございました。
よいFireBaseライフを！