[개발] 파이썬을 이용한 Firebase 사용법[3]

avatar

Firebase에 데이터 입출력에 대해서는 감을 잡은 것 같습니다. 그럼 기존에 steem관련 자산을 매일 excel로 저장하던 부분을 Firebase에 저장하는 것으로 변경해보도록 하겠습니다.

이를 위하여 app에서 간단하게 사용할 수 있도록 Firebase 저장용 class를 만들었습니다.

매일 mining하는 토큰의 경우에는 아래 함수를 사용합니다.
def add_daily_mining(self, acc, date, symbol, value) :

일별 자산 상태는 아래 함수를 사용합니다. 토큰 하나 씩 등록하는 함수와 steem, sbd, spa를 함께 등록하는 함수, 그리고 여러 토큰을 등록하는 함수 이렇게 세 개를 만들었습니다.

def add_daily_asset_status_one(self, acc, date, symbol, value) :
def add_daily_steem_asset_status(self, acc, date, num_steem, num_sbd, num_spa) :
def add_daily_asset_status_multi(self, acc, date, tokens) :

그리고 중복된 저장을 방지하기 위하여 특정 토큰에 대하여 가장 최근에 기록한 일자를 찾는 함수를 만들었습니다.
def get_last_day_daily_asset_status(self, acc, symbol ) :

검색의 효율을 위하여 이런 경우에도 DB에 최종 저장 일자를 저장하는 것도 방법입니다.

저는 steem family와 DEC, SPT, SCT, SCTM에 매일 상태를 저장할 예정입니다. DEC의 경우에는 일 채굴량도 함께 저장할 예정이고요.

클래스 전체 코드는 아래와 같습니다.

import firebase_admin
from firebase_admin import credentials
from firebase_admin import db

TA_DB_URL = 'my db url'
TA_KEY_FILE = "my key.json"

class myFireBaseScot :
    def __init__(self) :

        self.myFB = db
        self.cred = credentials.Certificate(TA_KEY_FILE)
        self.default_app = firebase_admin.initialize_app(self.cred, {'databaseURL':TA_DB_URL})

    # ====================================================================
    # add daily mining amount of each symbol
    def add_daily_mining(self, acc, date, symbol, value) :
        ref = self.myFB.reference('daily-mining')
        ret = ref.child(date).child(acc).child(symbol.upper()).set(value)    

    # ====================================================================
    # add daily asset amount    
    # daily asset including steem faimily and tokens 
    def add_daily_steem_asset_status(self, acc, date, num_steem, num_sbd, num_spa) :
        ref = self.myFB.reference('daily-asset')
        ref.child(date).child(acc).child('STEEM').set(num_steem)
        ref.child(date).child(acc).child('SBD').set(num_sbd)
        ref.child(date).child(acc).child('SPA').set(num_spa)
    # add daily asset of one symbol
    def add_daily_asset_status_one(self, acc, date, symbol, value) :
        ref = self.myFB.reference('daily-asset')
        ref.child(date).child(acc).child(symbol.upper()).set(value)
    def add_daily_asset_status_multi(self, acc, date, tokens) :
        ref = self.myFB.reference('daily-asset')
        for symbol in tokens :
            ref.child(date).child(acc).child(symbol.upper()).set(tokens[symbol])

    def get_last_day_daily_asset_status(self, acc, symbol ) :
        ref = self.myFB.reference('daily-asset')
        tuples = ref.get()
        latest_days = []
        for key in tuples :
            val = ref.child(key).child(acc).child(symbol.upper()).get()
            if val :
                latest_days.append(key)
        if latest_days :
            # sort latest_days 최신 날짜 돌려줌 내림차순
            slist = sorted(latest_days, key = lambda x: (x[0]), reverse=True)  # 0번째가 key 내림차순
            return slist[0]
        else :
            return None

    # ====================================================================
    def settings(self, acc, key, value) :
        ref = self.myFB.reference('settings')
        ref.child(acc).child(key).set(value)
    def firebase_add_trading() :
        print('h')

이제 이 class를 사용해 봅시다.

우선 class를 import합니다. 그 후 myFireBaseScot를 생성합니다.
이전에 만든 계정 별 steem관련 값을 얻는 함수에 아래와 같이 add_daily_asset_status_multi 함수를 호출하면 됩니다.

from util_fire_base import myFireBaseScot

my_DB = myFireBaseScot()

def get_steemit_asset() :
        :
        :
        dd = datetime.date.today()
        tokens = {'STEEM':bal_steem, 'SBD':bal_sbd, 'SPA':bal_sp}
        my_DB.add_daily_asset_status_multi(acc, dd.isoformat(), tokens)
        :

Firebase 덕분에 기존 코드를 쉽게 변경하여 필요한 데이터를 DB에 저장할 수 있게 되었습니다.

추가로 일별로 토큰 별 가격도 DB에 저장해 둡니다.
방법은 cur_prices 라는 가상의 토큰을 하나 만들어서 일별로 토큰별 가격을 저장하는 방식입니다. 일단은 저장 빈도를 하루로 했지만 필요하다면 1시간 혹은 10분 간격으로 저장할 수도 있을 것 같습니다.

## db에 오늘 현재가 등록
dd = datetime.date.today()
my_DB.add_daily_asset_status_multi("cur_prices", dd.isoformat(), prices)

마지막으로 Firebase 사용료에 대하여 확인해 보았습니다. 일단 1G Bytes까지는 공짜입니다. 그 이상부터는 용량에 따라 가격이 별도로 존재하고요. 자세히 보니 단순히 저장 공간의 크기만 문제가 아니라 일간 Read/Write과 월간 네트워크 사용량도 제한이 있습니다. 따라서 DB에 저장하는 데이터의 양은 최소로 가져가야 할 것 같습니다. 저장용량과 네트워크 양은 결국 돈입니다.



0
0
0.000
3 comments
avatar

Hi @tradingideas!

Your post was upvoted by @steem-ua, new Steem dApp, using UserAuthority for algorithmic post curation!
Your UA account score is currently 4.398 which ranks you at #2480 across all Steem accounts.
Your rank has not changed in the last three days.

In our last Algorithmic Curation Round, consisting of 111 contributions, your post is ranked at #17.

Evaluation of your UA score:
  • Some people are already following you, keep going!
  • The readers appreciate your great work!
  • Try to work on user engagement: the more people that interact with you via the comments, the higher your UA score!

Feel free to join our @steem-ua Discord server

0
0
0.000