PythonでSQLiteに接続して操作する方法+Flask連携も解説

株価分析ツールを作っていると過去のデータ、売買履歴などをしっかり残したいと思うようになります。
本記事では、Pythonで「SQLite × SQLAlchemy」によるDB接続から操作について解説します。

また、汎用的な「SQLAlchemy」の書き方から、Flaskへの導入方法まで網羅的に紹介します。

目次

SQLite / SQLAlchemyとは

SQLite(軽量DB)

SQLiteは、PostgreSQLやMySQLのような「サーバー」として動くDBではなく、「1つのファイル」として存在するデータベースエンジンです。

  • ファイル1つで動く
  • サーバー不要
  • 個人開発に最適

SQLAlchemy

SQLAlchemyは、ORM(Object-Relational Mapper)と呼ばれるライブラリです。SQLを直接書く代わりに、Pythonの「クラス」や「メソッド」を使ってDBを操作できます。
将来的にPostgreSQLなどへ移行したくなった時も、最小限の修正で対応できる「ポータビリティ」が魅力です。

  • PythonからDB操作できる
  • SQLを書かずに扱える
  • DB変更にも強い

実装コード(SQLAlchemy)

実際にコードを書きながら、モデル定義、DB作成、データ登録までの流れを説明します。
まずは、Flaskなどのフレームワークに依存しない、純粋なSQLAlchemyでの実装方法です。

インストール

まずは必要なライブラリをインストールします。
インストールは非常に簡単でターミナルやコマンドプロンプトで以下のコマンドを実行すればOKです。

pip install sqlalchemy

コード

import yfinance as yf
import pandas as pd

from sqlalchemy import Column, Integer, String, Float, DateTime, create_engine
from sqlalchemy.orm import declarative_base, sessionmaker
from datetime import datetime

# 1. モデル定義のベース作成
Base = declarative_base()

# 2. モデル(テーブル)の定義
class TradeLog(Base):
    __tablename__ = 'trade_logs'
    
    id = Column(Integer, primary_key=True)
    ticker_code = Column(String(10), nullable=False)
    entry_price = Column(Float)
    total_score = Column(Integer)
    created_dt = Column(DateTime, default=datetime.now)

# 3. DB接続とテーブル作成
engine = create_engine('sqlite:///trade_analysis_test.db', echo=True)
Base.metadata.create_all(engine)

# 4. セッションの準備
Session = sessionmaker(bind=engine)
session = Session()

try:
    # トヨタ自動車の証券コード+「.T」
    ticker = "7203.T"
    # Tickerオブジェクトを作成
    toyota = yf.Ticker(ticker)
    # periodを使って過去6ヶ月分のデータを取得
    df = toyota.history(period='6mo')

    # 5. データ登録
    new_trade = TradeLog(ticker_code=ticker, entry_price=df['Close'].iloc[-1], total_score=5)
    session.add(new_trade)
    session.commit()  # コミット

    # 6. データ取得
    # 全件取得
    all_trades = session.query(TradeLog).all()

    for trade in all_trades:
        print(f"銘柄: {trade.ticker_code}, スコア: {trade.total_score}, 価格: {trade.entry_price}")

except Exception as e:
    session.rollback() # エラー時はロールバック
    print(f"エラーが発生しました: {e}")

finally:
    session.close() # セッション終了

実行結果:

銘柄: 7203.T, スコア: 5, 価格: 3319.0

コードの解説

次にコードの解説を行います。

1.ベースクラス

Base = declarative_base()

モデル(テーブル)の親クラスになります。これを継承してテーブルを定義します。

2.モデル定義

class TradeLog(Base):

SQLAlchemyでは、DBのテーブルをPythonのクラスとして定義します。

3.DB接続とテーブル作成

engine = create_engine('sqlite:///trade_analysis_test.db', echo=True)
Base.metadata.create_all(engine)

データベースへの接続を作成し、定義したクラスを元に、まだテーブルがなければSQLを発行して作成します。
※「trade_analysis_test.db」はデータベースファイル名

4.セッション作成

Session = sessionmaker(bind=engine)
session = Session()

セッションを作成します。sessionmakerでDBエンジン設定済みのクラスを作成し、そこからインスタンス化したsessionで実際のクエリを管理します。

5.データ登録

new_trade = TradeLog(ticker_code=ticker, entry_price=df['Close'].iloc[-1], total_score=5)
session.add(new_trade)
session.commit()  # コミット

Pythonのオブジェクトを作って session.add() します。この時点ではSQLは発行されず、commit() したタイミングで INSERT 文が実行されます。

6.データ取得

all_trades = session.query(TradeLog).all()

session.query(クラス名) で、そのテーブルに対するクエリを開始します。
.filter() や .order_by() を繋げることで、SQLの WHERE や ORDER BY を組み立てることができます。

実装コード(Flask-SQLAlchemy)

次にFlaskでのWebアプリの構造に合わせた、Flask-SQLAlchemyを使った標準的な実装方法を紹介します。

FlaskでのWebアプリ作成とPythonで株価データを取得する方法は下の記事をみてね。

インストール

まずは必要なライブラリをインストールします。
インストールは非常に簡単でターミナルやコマンドプロンプトで以下のコマンドを実行すればOKです。

pip install Flask Flask-SQLAlchemy

コード

import yfinance as yf
import pandas as pd

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

app = Flask(__name__)

# 1. DB接続設定(Flaskのconfigに持たせる)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///trade_flask_test.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# 2. SQLAlchemyインスタンスの生成
db = SQLAlchemy(app)

# 3. モデル(テーブル)の定義
class TradeLog(db.Model):
    __tablename__ = 'trade_logs'
    
    id = db.Column(db.Integer, primary_key=True)
    ticker_code = db.Column(db.String(10), nullable=False)
    entry_price = db.Column(db.Float)
    total_score = db.Column(db.Integer)
    created_dt = db.Column(db.DateTime, default=datetime.now)

# 4. テーブルの作成(初回のみ)
with app.app_context():
    db.create_all()

# 5. データ登録
def add_trade():
    # トヨタ自動車の証券コード+「.T」
    ticker = "7203.T"
    # Tickerオブジェクトを作成
    toyota = yf.Ticker(ticker)
    # periodを使って過去6ヶ月分のデータを取得
    df = toyota.history(period='6mo')

    new_trade = TradeLog(ticker_code=ticker, entry_price=df['Close'].iloc[-1], total_score=6)
    db.session.add(new_trade)
    db.session.commit()

@app.route('/')
def index():
    add_trade() # データ登録
    all_trades = TradeLog.query.all()   # 6. データ取得 
    return render_template('index.html', name='Flask', all_trades=all_trades)

if __name__ == "__main__":
    app.run(debug=True)
<!DOCTYPE html>
<html>
<head><title>Flask Sample</title></head>
<body>
  <h1>Hello {{ name }}!</h1>
  <ul>
    {% for trades in all_trades %} 
      <li>銘柄:{{ trades.ticker_code }} / スコア:{{ trades.total_score }} / 価格:{{ trades.entry_price }}</li>		 
    {% endfor %}
  </ul>
</body>
</html>

実行結果:

ブラウザを開いて「http://127.0.0.1:5000」を実行します。

コードの解説

1.DB接続設定

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///trade_flask_test.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

SQLAlchemyでは create_engine を使いましたが、Flaskでは app.config に接続文字列を渡します。これにより、Flaskアプリ全体で一つのDB接続を共有できるようになります。
「app.config[‘SQLALCHEMY_TRACK_MODIFICATIONS’] = False」を設定していないと警告が出るので今回は設定しました。

2.初期化

db = SQLAlchemy(app)

SQLAlchemyのインスタンスを生成します。SQLAlchemyとFlaskを結合しsession管理もこれで自動化します。

3.モデル定義

class TradeLog(db.Model):

SQLAlchemyとほぼ同じでDBのテーブルをPythonのクラスとして定義します。

違いは、Base を自分で作る必要はなく、db.Model を継承するだけでOKです。
Column や Integer も、すべて db. から呼び出せるようになっているため、インポート文がスッキリします。

4.テーブルの作成

with app.app_context():
    db.create_all()

with app.app_context(): という一文が重要です。Flaskは「今どのアプリが動いているか」という情報(コンテキスト)を大事にするため、このブロックの中で実行する必要があります。

6.データ登録

def add_trade():
  ・・・
    new_trade = TradeLog(ticker_code=ticker, entry_price=df['Close'].iloc[-1], total_score=6)
    db.session.add(new_trade)
    db.session.commit()

SQLAlchemyでは session オブジェクトを自分で作る(Session = sessionmaker…)必要がありましたが、Flask-SQLAlchemyでは db.session が最初から用意されています。

セッションの作成・破棄もFlaskがリクエストのタイミングに合わせて自動で行ってくれます。

6.データ取得

all_trades = TradeLog.query.all()

db.session.query(TradeLog) と書く代わりに、TradeLog.query というショートカットが使えます。

データを確認するツール

DBの中身を直接覗くことは、デバッグ作業において非常に重要です。DBの中身を確認できるツールをご紹介します。

  • SQLite Viewer (VS Code拡張): エディタ内で即確認。
  • DB Browser for SQLite: 定番の軽量ツール。
  • DBeaver: 将来のPostgres移行も見据えたプロ向けツール。
下は[SQLite Viewer]による画面表示イメージだよ。

【SQLite Viewer (VS Code拡張)】の表示イメージ

まとめ

DB設計は、システム開発における「土台」です。
今回は汎用的なSQLAlchemyを中心に解説しましたが、この基礎を理解していればFlaskでも迷うことはありません。

今回のポイントは次の通りです。

  • SQLiteで手軽にDB構築できる。
  • SQLAlchemyで柔軟に操作できる。
  • GUIツールで可視化すると理解が深まる。
  • Flask-SQLAlchemyでWebアプリにも組み込める。

【投資に関する免責事項】
本ブログで紹介している株価解析ツールによるスコアリングおよび銘柄分析は、あくまで個人の学習・研究および技術検証を目的としたものであり、特定の銘柄の売買を推奨するものではありません。

ツールの算出結果や掲載情報の正確性については万全を期しておりますが、その内容を保証するものではありません。投資の最終決定は、必ずご自身の判断と責任において行っていただきますようお願いいたします。

万一、本ブログの情報に基づいて被ったいかなる損害についても、当サイトおよび運営者は一切の責任を負いかねますのであらかじめご了承ください。

目次