目的
この章では、カテゴリ(収入/支出)を管理するためのテーブルをSQLALchemyで作成す。
最終的には以下のような構成を持つcategoriesテーブルを作ります。
| id | name | expence_type |
|---|---|---|
| 1 | 食費 | expence |
| 2 | 給料 | income |
フォルダ構成
app/
├── models/
│ └── budget.py ← Categoryモデル定義
├── routes/
│ └── category.py ← APIルーティング
├──__init__.py ← Flaskアプリの初期化
├── db.py ← DB作成+初期データ投入スクリプト
├── init_db.py ← SQLAlchemyの初期化
static/
├── js/
│ └── CategoryManager.js ← カテゴリを操作するJS
templates/
└── index.html ← HTMLファイル(css)
1.Categoryモデルの定義
Categoryモデルを作成します。
作成したモデルをdbインスタンスに渡します。
models/budget.pyを作り、以下のコードを記述。
app/models/budget.py
from app.db import db
class Category(db.Model):
__tablename__ = "categories"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
expense_type = db.Column(db.String(10), nullable=False) # 'expense' or 'income'
-
id: 主キー -
name: カテゴリ名 -
expense_type:"expense"または"income"
2.SQLALchemyの初期化
dbインスタンスを作成します。
app/db.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
3.Flaskアプリの初期化
app/db_init.pyで必要なFlaskアプリを初期化
app/__init__.py
from flask import Flask
def create_app():
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///Household_accounting_management.db"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
from app.db import db
db.init_app(app)
return app
4.DB初期化スクリプトを作る
appインスタンスを作成し、DBの初期化と初期カテゴリ登録を行う部分
app/db_init.py
from app import create_app
from app.db import db
from app.models.budget import Category
app = create_app()
with app.app_context():
db.create_all()
print("DB初期化が完了しました")
# 初期カテゴリ登録(任意)
initial_categories = [
Category(name="食費", expense_type="expense"),
Category(name="給料", expense_type="income"),
]
db.session.add_all(initial_categories)
db.session.commit()
print("初期カテゴリを追加しました")
5.初期化を実行する
ターミナルで以下のコマンドを実行。
bash
python app/init_db.py
実行後、以下のようなログが出れば成功。
bash
DB初期化が完了しました
初期カテゴリを追加しました
補足 ModuleNotFoundError: No module named 'app'が出たら
これはPythonにappモジュールの場所が伝わっていないのが原因です。
下記コマンドでプロジェクトルートを明示的に指定しましょう
bash
set PYTHONPATH=.
この章のまとめ
- SQLAlchemyでカテゴリ用の
Categoryモデルを定義した -
init_db.pyでテーブルを作成し、初期カテゴリも登録した - DBの初期化は
python init_db.py一発で完了!
次章では、作成したカテゴリ情報をREST API(GET/POST/PUT/DELETE)で操作できるようにする実装に進みます。