LoginSignup
2
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-02-17

前回

Python3で自宅PCからFirestoreを操作する実験(その1、アプリで使うプレイヤー情報を作ってみる)
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

2.ガンガン入れちゃいましょう!!

全プレイヤーのスコアを3つずつ作っていきます。

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

というわけで・・・

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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1