资料储存 - 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 取得资料後存入。


<<:  DAY29-总结一下吧

>>:  人脸辨识-day26

Day12 安装外接磁碟机与磁碟片 - 取得 Lua shell script 的参数列

前几天我将 CC: Tweaked 电脑的开机和程序执行流程大致摸熟後,今天我想来看看新的「硬体」 ...

我的第一份实习

前面有提到,我在大一的时候就有花费大量的时间打工,到了升上大二的暑假前我也开始思考这样到底是不是对的...

Day 26 讨论 AI 深度学习论点

大家好~~欢迎来到第二十六篇 聊聊 AI 相关论点 本篇呢,来跟大家分享之前本人有做过一个跟车子有关...

第二十七天:用 TeamCity 部署 API 文件

在昨天的练习里,我们使用 TeamCity 在建置流程的最後一步产生 API 文件,并让文件可以直接...

Day 0x3 UVa10222 Decode the Mad man

Virtual Judge ZeroJudge 题意 输入一加密过字串,解密方式为键盘上向左两格,输...