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

in sct •  last month 

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에 저장하는 데이터의 양은 최소로 가져가야 할 것 같습니다. 저장용량과 네트워크 양은 결국 돈입니다.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

@tipu curate

Upvoted 👌 (Mana: 10/20)

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