iT邦幫忙

2021 iThome 鐵人賽

DAY 26
0
永豐金融APIs

永豐金融APIs - 從零開始到放棄!?系列 第 26

資料儲存 - SqlAlchemy

之前我們做的所有操作,都是在 Jupyter Notebook 進行,沒有進行資料儲存的動作,所以只要 Jupyter Notebook 一關閉或是重啟,所有的資料都要重新來過,包含之前我們有做 Line 機器人也是一樣,也沒有進行資料的儲存,使用上就少了很多可以操作的空間。

所以一個完整的程式,還是要有資料儲存的功能,我推薦使用 SqlAlchemy,這是 python 很多人使用的 ORM 架構,一般的資料儲存,是直接對資料庫下指令,所以開發者要同時使用 sql 指令和 python 指令,而且 sql 指令要搭配不同的 sql,像是 mssql,mysql, postgresql, sqlite...等,換了一個資料庫,就要對 sql 語法進行 review 調整,雖然換資料庫的情形不常見,不過如果有 ORM 架構的話,就可以省下很多事,當然 ORM 也不是沒有缺點,因為最終資料庫還是只接受 sql 指令,等於中間要多一層轉譯,會損失一點效能,不過在這效能過剩的時代,其實也還好,除非要追求極致效能,不然使用 ORM 會方便很多。

ORM

我們要使用的資料庫為 sqlite,是一種無伺服器的資料庫,所有的資料都是存在一個檔案中,sqllite + SqlAlchemy 可以快速的建立起資料庫的架構,而且日後有需要提升資料庫效能時,直接替換掉 DB-API 就可以直上了,非常方便

  1. 安裝 SqlAlchemy
pip install sqlalchemy

sqlite 有內建的 DB-API,不需要另外安裝

  1. 建立資料庫連接類別

database.py

from sqlalchemy import create_engine
from sqlahchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "sqlite:///stock.db"

engine = create_engine(
    SQLALCHEMY_DATABASE_URL, connect_args=("check_same_thread": False)
)

session = ssessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

關於 SQLALCHEMY_DATABASE_URL 請參考 SqlAlchemy 文件

  1. 建立 model 類別

models.py


from sqlalchemy import Column, String, DateTime, DECIMAL, Integer
from .database import Base

class Kbars(Base):
    __tablename__ = 'kbars'

    stock_code = Column(String, primary_key=True)
    datetime = Column(DateTime(timezone=False), primary_key=True)
    open = Column(DECIMAL(precision=2))
    high = Column(DECIMAL(precision=2))
    low = Column(DECIMAL(precision=2))
    close = Column(DECIMAL(precision=2))
    volume = Column(Integer)
    
    def __init__(self, stock_code, datetime, open, high, low, close, volume):
        self.stock_code = stock_code
        self.datetime = datetime
        self.open = open
        self.high = high
        self.low = low
        self.close = close
        self.volume = volume

    def __repr__(self):
        return "Stock: {} datetime: {} open:{}|high:{}|low:{}|close:{}|volume:{}".format(self.stock_code, self.datetime, self.open .self.high, self.low, self.close, self.volume)
  1. 呼叫 sqlalchemy:
    基本上相關的設定就在上面了,接下來就是在我們要存取資料的地方,呼叫 sqlalchemy

main.py

from models import Kbars
from sqlalchemy.sql.expression import and_
from database import session, engine
from sqlalchemy import func
from datetime import datetime

db = session()

# 這一段很重要,會自動建立 table
models.Base.metadata.create_all(bind_engine)

# 新增一筆假資料
kbar = Kbar("2330", datetime(2021, 10, 4, 13, 17), 571, 571, 570, 570, 129)

db.add(kbar)
db.commit()


kbars = db.query(Kbars)\
   .filter(and_(func.date(Kbars.datetime) >= start, 
                func.date(Kbars.datetime) <= end, 
                Kbars.stock_code == stock_code)).all()

以上就是一個很簡單的存取示範,明天再來介紹,如何從 Shioaji 取得資料後存入。


上一篇
策略實作 - 葛蘭碧八法
下一篇
資料取得 - 多重來源
系列文
永豐金融APIs - 從零開始到放棄!?30

尚未有邦友留言

立即登入留言