REST APIで使用するFirebase Realtime Database

# はじめに
Webアプリを作った際、（無料枠マニアだと）サーバーサイドのログなどの保管場所に悩む場合があります
ストレージやRDBなど無料枠が無いものが多くそれらにログを出力するのも面倒です
そんなとき、REST APIで使用するFirebase Realtime Databaseがとても楽です
JsonをPostするだけでデータが追加でき、Keyを指定してGetすると対象データが取得できます

#Realtime Databaseを作る
####1. Firebaseのプロジェクトを作る
####2. RealtimeDatabaseを作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911989/df4aba1e-da2e-52f1-ed16-8a0d291eab74.png)
####3. ルールを適当に書く

これをやらないと誰でもDBに書き込めてしまう
下記ルールであればGUIDが分からなければ書き込めない
本来は認証機能を使うべき
orderBy等を使用する場合はIndexを貼る必要がある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911989/ce70cdd7-0bf0-3c0c-b060-863252c6fd18.png)

####4. DBの作成完了！

#####DBのURL
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911989/ef47e912-2275-6c36-a25c-3399654ec63a.png)

+.jsonでアクセス出来ます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911989/d4b1b163-ef3b-61e9-4fd5-2c09fa1e739c.png)

# 使ってみる

#####コード

```python:test.py
import requests
import json

url = "https://datastore-da5b8-default-rtdb.firebaseio.com/E87A1EE20027454E80F85BFE88513E5B/"

#POSTでInsert
res = requests.post(url + ".json", data='{"name":"tanaka","age":99}')
print("Post-Result:"+res.text)
res_data = json.loads(res.text)

#GETでSelect
res = requests.get(url + res_data["name"] + ".json")
print("Get-Result:"+res.text)
```

#####実行結果
```
Post-Result:{"name":"-MjFSvNWSHlmj-0psVlK"}
Get-Result:{"age":99,"name":"tanaka"}
```


###ちょっと便利なラッパー

```python:repository.py
import requests

class Repository:
    repository_url = ""

    def __init__(self, repository_url):
        self.repository_url = repository_url

    def select(self, repository_key, queryString=""):
        return requests.get(self.repository_url + repository_key + ".json" + queryString)

    def insert(self, repository_key, data):
        return requests.post(self.repository_url + repository_key + ".json", data=data.encode('utf-8'))

    def update(self, repository_key, data):
        return requests.patch(self.repository_url + repository_key + ".json", data=data.encode('utf-8'))

    def delete(self, repository_key):
        return requests.delete(self.repository_url + repository_key + ".json")

```

####ラッパーの使い方
```python:test2.py
import json
from repository import Repository

# さまざまな要素に基づいてデータをフィルタリングするクエリを構築できます。
# 初めに、orderBy パラメータを使用して、データをどのようにフィルタリングするかを指定します。
# 次に、orderBy を他の 5 つのパラメータ（limitToFirst、limitToLast、startAt、endAt、equalTo）のいずれかと組み合わせます。

url = "https://datastore-da5b8-default-rtdb.firebaseio.com/E87A1EE20027454E80F85BFE88513E5B/"
repository = Repository(url)

res = repository.insert("", json.dumps({"key": 123, "value": "text"}))
print("insert:"+res.text)
res = repository.update(json.loads(res.text)["name"], json.dumps(
    {"key": 432, "value": "aaa"}))
print("update:"+res.text)
res = repository.insert("", json.dumps({"key": 678, "value": "bbb"}))
print("insert:"+res.text)
res = repository.select("", '?orderBy="key"&limitToFirst=1')
print("select:"+res.text)

res = repository.select("", '?orderBy="value"&equalTo="bbb"')
print("select:"+res.text)

res = repository.select("")
print("select:"+res.text)
object_list = json.loads(res.text)

for key in object_list.keys():
    print("child:"+key)
    res = repository.delete(key)

```

#####実行結果
```
insert:{"name":"-MjFUn6heZhSbLtwXKqa"}
update:{"key":432,"value":"aaa"}
insert:{"name":"-MjFUnL2aCWPxGaC_BUV"}
select:{"-MjFRuYFzvirMQEOqKJy":{"age":99,"name":"tanaka"}}
select:{"-MjFUnL2aCWPxGaC_BUV":{"key":678,"value":"bbb"}}
select:{"-MjFRuYFzvirMQEOqKJy":{"age":99,"name":"tanaka"},"-MjFSN-WhdkX2sWh6ayH":{"age":99,"name":"tanaka"},"-MjFSRjuToqQCwC2FLf0":{"age":99,"name":"tanaka"},"-MjFSvNWSHlmj-0psVlK":{"age":99,"name":"tanaka"},"-MjFUn6heZhSbLtwXKqa":{"key":432,"value":"aaa"},"-MjFUnL2aCWPxGaC_BUV":{"key":678,"value":"bbb"}}
child:-MjFRuYFzvirMQEOqKJy
child:-MjFSN-WhdkX2sWh6ayH
child:-MjFSRjuToqQCwC2FLf0
child:-MjFSvNWSHlmj-0psVlK
child:-MjFUn6heZhSbLtwXKqa
child:-MjFUnL2aCWPxGaC_BUV
```


#参考文献
https://firebase.google.com/docs/database/rest/start?hl=ja