Python3で自宅PCからFirestoreを操作する実験（その２、アプリでスコアをアップロードする）

#前回
Python3で自宅PCからFirestoreを操作する実験（その１、アプリで使うプレイヤー情報を作ってみる）
https://qiita.com/bcosizm/items/84f90906951244c685b3

#概要
前回の内容で作成したプレイヤー情報の一つ

`ID:kSBsA0X2ojqF2UIHWUfZ ニックネーム：島国DNA`

でスコアをアップロードします。

※Firebase関連のインストールやPython自体の使い方、スコアのデータモデルは前回を参照のこと。

前回同様、データ構成は以下の通り。
####Playersコレクション（プレイヤー情報をストック）

| フィールド       |    説明    |
|:-----------------|:-------------------|
| id             |        自動付与のユニーク文字列        |
| player_name             |        プレイヤー名        |
| code           |       プレイヤーの特定に使用(※1)       |
| date             |        データの作成・更新日時        |


####Scoreコレクション（スコアをストック）

| フィールド       |    説明    |
|:-----------------|:-------------------|
| id             |        自動付与のユニーク文字列        |
| player_id             | スコアを出したプレイヤーのid        |
| player_name             | スコアを出したプレイヤーの名前        |
| character           | 使用キャラ名（※2）       |
| score           | スコア       |
| date             |        データの作成日時        |

#参考
Firebaseドキュメント＞Cloud Firestoreβ＞スタートガイド
https://firebase.google.com/docs/firestore/quickstart?hl=ja

#実装
###0.初期化

```
>>> import firebase_admin
>>> from firebase_admin import credentials
>>> from firebase_admin import firestore
>>> import datetime
>>>
>>> # 初期化
>>> # /Users/xxxx/yyyy/zzzz.jsonはダウンロードした秘密鍵のパス
>>> cred = credentials.Certificate('/Users/xxxx/yyyy/zzzz.json')
>>> firebase_admin.initialize_app(cred)
<firebase_admin.App object at 0x@@@@@@@@@>
>>>
>>> db = firestore.client()
>>>
>>> your_player = db.collection(u'Players').document(u'kSBsA0X2ojqF2UIHWUfZ').get()
```
初期化は前回と同様です。

前回、作ったユーザデータID「kSBsA0X2ojqF2UIHWUfZ」をローカルに保存しておいた前提でプレイヤーIDを取得し、プレイヤー情報を反映させた形でゲームスコアをアップロードします。

※存在しないIDのコレクションやドキュメントを要求した場合、IDだけ生成された新規データが作られるのがFirestoreの仕様です。ユーザ登録の有無をチェックするならばドキュメントの中身、フィールドでチェックすることが望ましいでしょう。
~~ただ、ヘタをこくと無駄データが無尽蔵に作られそうではあります。他にいい案があればお願いします。~~
(↑、確認しましたが下位のデータがセットされないとコレクションもドキュメントも永続化されない模様です~2019/02/17~)

###1.新規作成

```
>>> doc_score_ref = db.collection(u'Score') # コレクション” Score”作成
>>> new_score_ref = doc_score_ref.document() # ”Score”直下でドキュメントを新規で作成
>>> new_score_ref.set({
...     u'player_id' : your_player.id,
...     u'player_name' : your_player.to_dict()['player_name'],
...     u'character' : 1,
...     u'score' : 9999,
...     u'date' : datetime.datetime.today()
... })
update_time {
  seconds: 1550343634
  nanos: 334569000
}
```

反映されていることを確認。
![スクリーンショット 2019-02-17 4.01.13.png](https://qiita-image-store.s3.amazonaws.com/0/110583/28cb3f3d-29e3-a1e0-8636-c7427a40f937.png)


###2.ガンガン入れちゃいましょう!!
全プレイヤーのスコアを３つずつ作っていきます。

```
>>> docs_player = db.collection(u'Players').get()
>>> for player in docs_player:
...     new_score_ref = doc_score_ref.document()
...     new_score_ref.set({
...             u'player_id' : player.id,
...             u'player_name' : player.to_dict()['player_name'],
...             u'character' : 1,
...             u'score' : 9999,
...             u'date' : datetime.datetime.today()
...     })
...     new_score_ref = doc_score_ref.document()
...     new_score_ref.set({
...             u'player_id' : player.id,
...             u'player_name' : player.to_dict()['player_name'],
...             u'character' : 2,
...             u'score' : 10000,
...             u'date' : datetime.datetime.today()
...     })
...     new_score_ref = doc_score_ref.document()
...     new_score_ref.set({
...             u'player_id' : player.id,
...             u'player_name' : player.to_dict()['player_name'],
...             u'character' : 3,
...             u'score' : 10001,
...             u'date' : datetime.datetime.today()
...     })
... 
update_time {
  seconds: 1550344373
  nanos: 397202000
}

update_time {
  seconds: 1550344373
  nanos: 681606000
}

update_time {
  seconds: 1550344373
  nanos: 980847000
}

update_time {
  seconds: 1550344374
  nanos: 233174000
}

update_time {
  seconds: 1550344374
  nanos: 590412000
}

update_time {
  seconds: 1550344374
  nanos: 848270000
}

update_time {
  seconds: 1550344375
  nanos: 124795000
}

update_time {
  seconds: 1550344375
  nanos: 380322000
}

update_time {
  seconds: 1550344375
  nanos: 657326000
}

update_time {
  seconds: 1550344375
  nanos: 935367000
}

update_time {
  seconds: 1550344376
  nanos: 247890000
}

update_time {
  seconds: 1550344376
  nanos: 457700000
}
```
反映されました。（最初に作ったスコアは削除しました）
![スクリーンショット 2019-02-17 4.17.36.png](https://qiita-image-store.s3.amazonaws.com/0/110583/de38ba88-6fdf-95fa-019b-5d0ee4c5208b.png)

#というわけで・・・
今回はこの辺にしといたりますわ！
次回はランキングデータの操作です！