ほぼ https://github.com/nhorvath/Pyrebase4 にある内容と一緒です。
firebaseは無料で使えるので趣味グラマにはかなり良い選択肢だと思います。
今回はそのfirebaseのpython版ライブラリであるpyrebase4の基本構文をまとめておきます。
おまじない
config = {
"apiKey": "***",
"authDomain": "***",
"databaseURL": "***",
"storageBucket": "***"
}
firebase = pyrebase.initialize_app(config)
db = firebase.database()
これらのconfigは概要→登録したアプリ内の設定で見ることができます。
データ作成
push
data = {"name": "Mortimer 'Morty' Smith", "age": "17"}
db.child("users").push(data)
set
data = {"age": "17"}
db.child("users").child("Morty").push(data)
pushとsetは両方ともデータを作成しますが、pushはランダムな自動生成のkeyを使い、setは自分で用意したkeyを使います。後で探すときにどちらが良いかの話だと思います。
オンラインゲームのようなcreateが頻発するような場合は前者で、wikiのような管理された情報の場合は後者な気がします。
データ変更
db.child("users").child("Morty").update({"name": "Mortiest Morty"}) #update
db.child("users").child("Morty").remove() #remove
childでkeyを指定している部分がミソです。
data = {
"users/Morty/": {"name": "Mortimer 'Morty' Smith"},
"users/Rick/": {"name": "Rick Sanchez"}
}
db.update(data)
このように複数のデータを変更することもできるようです。その場合データは辞書の辞書で、辞書キーはデータへのpathのような形になっています。
データ検索
基本的にchild().get()
でデータの検索結果オブジェクトが取れるようです。
検索結果オブジェクトにはval, key, eachが存在します。
- val: 検索結果のvalueを出します
- key: 検索結果のkeyを出します
- each: 検索結果1つ1つに対して上の処理を行えます
users = db.child("users").get()
print(users.val()) # {"Morty": {"name": "Mortimer 'Morty' Smith"}, "Rick": {"name": "Rick Sanchez"}}
print(users.key()) # users
for user in users.each():
print(user.key()) # Morty
print(user.val()) # {"name": "Mortimer 'Morty' Smith"}
これを見ると、子要素のデータのkeyはeachでしか取り出せないような形に見えます。
と思っていたらshallowを使えば良いらしいです。
all_user_ids = db.child("users").shallow().get() # ["Morty", "Rick"]
検索クエリ
もちろん複雑な検索もできます。ただかなり最低限のものに限られているようです。
# ランキング: 名前要素でソートして、最も若い順に3件取り出します
# 例えば作成された日付が早い順や、人数が少ない順とか
users_by_name = db.child("users").order_by_child("name").limit_to_first(3).get()
# イコール: scoreが10と等しいもののみを取り出します
# bool値に使いやすそうです
users_by_score = db.child("users").order_by_child("score").equal_to(10).get()
# 3番目から10番目を取り出します
users_by_score = db.child("users").order_by_child("score").start_at(3).end_at(10).get()
これらはfirebaseにあらかじめindex登録をしておく必要がありそうです。
詳細は以下の記事
要はfirebaseに以下のようなルールを追加しておきます
{
"rules": {
"rooms": {".indexOn": ["player_count", "is_private"]},
".read": true,
".write": true
}
}
その他
他にもローカルファイルの画像をfirebase上に上げられるstorageなどがあるっぽいです。
自分はいらないので割愛しますが、画像が扱いやすいのはかなりアドバンテージな気がしました。
以上が基本的なチートシートになります。