🐃

🔧 FlaskによるSQLiteとSQLAlchemyを用いた実践的データ管理アプリケーション構築入門

に公開

📝 はじめに

FlaskはPython製の軽量なWebフレームワークとして広く普及しており、その柔軟な設計と拡張性から教育用途やプロトタイピング、本格的なWebアプリケーション開発においても活用されています。本稿では、SQLiteおよびSQLAlchemyとの連携により、永続的なデータ管理を行うFlaskアプリケーションの構築方法を体系的に解説します。

特に、本記事は、ユーザー登録、データベース保存、一覧表示といったWebアプリケーションにおける中核的なデータフローの実装に焦点を当てており、理論と実践を橋渡しする内容となっています。

📦 推奨プロジェクト構成とその意義

プロジェクト構成の一例を以下に示します。

project/
├── app.py               # メインアプリケーションエントリポイント
├── models.py            # データベースモデル(ORM定義)
├── forms.py             # フォームクラス(Flask-WTF)
├── templates/           # HTMLテンプレート
│   ├── register.html    # 登録フォーム用テンプレート
│   └── users.html       # ユーザー一覧表示テンプレート
└── db.sqlite3           # SQLiteデータベースファイル

この構成は、役割に応じたファイル分離により保守性と拡張性を確保する基本設計の好例です。

🧱 ORMモデル定義(models.py)

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

このUserクラスはSQLAlchemyのModelクラスを継承し、ユーザー情報を格納するテーブル構造を宣言的に定義しています。カラムに対してunique=Trueやnullable=Falseなどの制約を設けることで、データ整合性を確保します。

📋 入力バリデーション付きフォーム構築(forms.py)

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired, Email

class RegisterForm(FlaskForm):
    username = StringField('ユーザー名', validators=[DataRequired()])
    email = StringField('メールアドレス', validators=[DataRequired(), Email()])
    submit = SubmitField('登録')

Flask-WTFを用いることで、CSRF対策付きのフォーム生成が可能になります。バリデーションルール(必須入力、正しいメール形式など)も簡潔に定義できます。

⚙️ アプリケーション構築とルーティング(app.py)

from flask import Flask, render_template, redirect, url_for
from models import db, User
from forms import RegisterForm

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite3'
app.config['SECRET_KEY'] = 'secret-key'
db.init_app(app)

@app.before_first_request
def create_tables():
    db.create_all()

初回リクエスト時にデータベースを自動生成するよう設定されています。

@app.route('/register', methods=['GET', 'POST'])
def register():
    form = RegisterForm()
    if form.validate_on_submit():
        user = User(username=form.username.data, email=form.email.data)
        db.session.add(user)
        db.session.commit()
        return redirect(url_for('user_list'))
    return render_template('register.html', form=form)

validate_on_submit() によりPOST時にバリデーション処理が実行され、正しい入力であれば新規ユーザーがDBに登録されます。

@app.route('/users')
def user_list():
    users = User.query.all()
    return render_template('users.html', users=users)

全ユーザー情報をデータベースから取得し、テンプレートに渡して描画します。

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

開発時はdebug=Trueで再起動の自動化やトレースバックの表示が可能です。

📝 Jinja2テンプレートによる動的レンダリング(templates)

register.html

<form method="POST">
  {{ form.hidden_tag() }}
  {{ form.username.label }} {{ form.username }}<br>
  {{ form.email.label }} {{ form.email }}<br>
  {{ form.submit }}
</form>

Jinja2テンプレートを通じてFlask-WTFフォームオブジェクトをHTMLにバインディングしています。

users.html

<ul>
  {% for user in users %}
    <li>{{ user.username }} - {{ user.email }}</li>
  {% endfor %}
</ul>

登録済みのユーザー一覧をループで動的に描画します。データベースとビュー層の連携が明確です。

✅ 総括と次なる展開

本稿では、SQLiteとSQLAlchemyをFlaskに統合し、ユーザー登録および一覧表示機能を構築するプロセスを詳細に解説しました。

  • データベース構造のORM設計
  • CSRF保護付きフォームによる入力処理
  • HTTPルーティングとテンプレートレンダリングの連携

この基礎的実装は、次のステップとして以下の拡張に容易に発展可能です:

  • ユーザー認証(ログイン/ログアウト)
  • 入力チェックの強化とエラーハンドリング
  • パスワードのハッシュ化とセキュリティ対策
  • RESTful APIとの接続、あるいはJavaScriptによる非同期通信

FlaskとSQLAlchemyの併用により、スケーラブルかつ拡張性に富んだアプリケーションの土台を構築できます。


株式会社ONE WEDGE

【Serverlessで世の中をもっと楽しく】 ONE WEDGEはServerlessシステム開発を中核技術としてWeb系システム開発、AWS/GCPを利用した業務システム・サービス開発、PWAを用いたモバイル開発、Alexaスキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
https://onewedge.co.jp/

Discussion