Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

前回

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

というわけで・・・

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

bcosizm
長年、広く浅くやってきた結果、自分はどんなエンジニアといっていいのかと悩む日々。主な使用言語はC言語、C++、Java、ActionScript3、JavaScript、PHP、SQL。 プライベートでAndroidアプリ配布したり、プログラムだけでなくいろいろゴチャゴチャやってます。大昔にWindowsで「RoughMetal」「NAMAKO02」ってフリーゲーム配布してました。
http://www012.upp.so-net.ne.jp/B-cos/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away