[개발] 파이썬을 이용한 Firebase 사용법[3]
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에 저장하는 데이터의 양은 최소로 가져가야 할 것 같습니다. 저장용량과 네트워크 양은 결국 돈입니다.
@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:
Feel free to join our @steem-ua Discord server