技術ブログ 2週間目

目次

第2週のプラン:データベース連携の基礎(データの記憶)

1. データベースの選定とセットアップ

今回は、学習用として非常に手軽で、特別なサーバーを立てる必要がないSQLiteというデータベースを使用します。
そして、Pythonからデータベースを操作するために、SQLAlchemyというライブラリと、それをFlaskで使いやすくするためのFlask-SQLAlchemyという拡張機能を使用します。

データベースSQLite
ライブラリSQLAlchemy
拡張機能Flask-SQLAlchemy


1-1. Flask-SQLAlchemy のインストール

以下のコマンドでFlask-SQLAlchemyをインストール

pip install Flask-SQLAlchemy

1-2. app.py の設定変更

Flaskアプリケーション(app.py)に、データベースを使用するための設定を追加します。

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy # SQLAlchemyをインポート

app = Flask(__name__)

# データベース設定の追加
# SQLiteデータベースファイルのパスを指定
# 'sqlite:///site.db' は、プロジェクトフォルダ内に 'site.db' という名前のデータベースファイルを作成することを意味します。
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
# 追跡機能を無効にする(リソース節約のため)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# SQLAlchemyオブジェクトの初期化
db = SQLAlchemy(app)

@app.route("/")
def index():
    return render_template("index.html")

# ここから追加
@app.route("/about") # 新しいルーティングを追加
def about():
    #return "<h1>このアプリについて</h1><p>これは私の初めてのFlaskアプリです。</p>"
    return render_template("about.html") #HTMLテンプレートをレンダリングして返す

@app.route("/greet/<string:name>") # <name> 部分がURLパラメータ
def greet(name): # 関数にパラメータを受け取る引数を追加
    # 変更前: return f"<h1>Hello, {name}!</h1><p>Welcome to your personalized page!</p>"
    # 変更後: render_template を使って greet.html にデータを渡す
    return render_template("greet.html", username=name) # usernameという名前で name の値を渡す

@app.route("/user/<int:user_id>")
def show_user(user_id):
    return f"ユーザーIDは {user_id} です。"

@app.route("/calculate/<num1>/<num2>")
def caluculate(num1,num2):
    try:
        # URLパラメータは文字列として受け取られるので、int()で数値に変換
        number1 = int(num1)
        number2 = int(num2)
        total = number1 + number2

        # calculate.html に計算結果を渡してレンダリング
        return render_template("calculate.html",num1 = number1,num2 = number2,total = total)
     
    except ValueError:
        # エラーページをレンダリングすることも可能ですが、今回は直接メッセージを返します
        return "エラー: 無効な数値が指定されました。", 400

@app.route("/product/<id>/<name>")
def product(id,name):
    return render_template("product.html", product_id = id, product_name = name)

if __name__ == '__main__':
    app.run(debug=True)

2. データベースモデルの定義

次に、家計簿の「記録」を保存するためのデータ構造(テーブルの設計図)をPythonコードで定義します。これをモデルと呼びます。

app.pyに、db = SQLAlchemy(app)の直後あたりに、以下のクラス定義を追加

# ... 省略(既存のコード) ...

db = SQLAlchemy(app)

# ここから追加
class Transaction(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    date = db.Column(db.String(20), nullable=False) # 日付 (例: '2025-07-01')
    item = db.Column(db.String(100), nullable=False) # 項目名 (例: '食費', '交通費')
    amount = db.Column(db.Integer, nullable=False) # 金額 (整数)

    def __repr__(self):
        return f"Transaction('{self.date}', '{self.item}', {self.amount})"
# ここまで追加

@app.route("/")
def index():
    return render_template("index.html")

# ... 省略(残りのコード) ...

3. データベースの作成と初期化

モデルを定義しただけでは、まだ実際のデータベースファイルは作成されていません。次に、定義したモデルに基づいてデータベースファイルとテーブルを作成します。

このステップは、Flaskアプリケーションを起動する前に行う必要があります。

Pythonのインタプリタ(対話モード)を起動して以下を実行。

from app import app, db
app.app_context().push()
db.create_all()
exit()

site.dbmy_money_app/instance/site.dbのパスに作成されました。

これでデータを保存するための箱と設計図が用意されました。

次は実際にデータを追加します。Pythonインタプリタが起動して

from app import app, db, Transaction
app.app_context().push()

# 新しい取引データを作成
transaction1 = Transaction(date='2025-07-01', item='食費', amount=1500)
transaction2 = Transaction(date='2025-07-02', item='交通費', amount=300)
transaction3 = Transaction(date='2025-07-02', item='給料', amount=100000)

# データベースに追加
db.session.add(transaction1)
db.session.add(transaction2)
db.session.add(transaction3)

# 変更をコミット(保存)
db.session.commit()

print("データが追加されました。")

exit()

データ確認

ちゃんとデータが挿入されていました。

おまけ

毎度恒例、NotebookLMに読み込ませてみました。以下、音声データです。

音声データ書き出しの他にも、マインドマップの作成も可能です。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次