Pythonコードからデータベースを扱う! ORMとCRUD操作を学ぼう
はじめに
前回までの内容で、フォームからの入力を受け取り、テンプレートを使って動的にページを生成する方法を学びました。
しかし、アプリケーションを運用していくうえでは、入力したデータを保存し、あとで取り出したり、更新や削除を行ったりする必要があります。そこで登場するのがデータベース(DB)との連携です。
今回のFlask_Vol6では、SQLiteなどシンプルなDBを例に、SQLAlchemyを利用した**ORM(Object-Relational Mapping)**の基本と、CRUD操作(Create, Read, Update, Delete)の実装手順を解説します。

1. ORM(Object-Relational Mapping)の理解
ORMとは?
ORM(Object-Relational Mapping) とは、データベースのテーブルやレコードを、プログラミング言語上のクラスやインスタンス(オブジェクト)として扱えるようにする仕組みです。これにより、開発者は直接SQL文(SELECT
, INSERT
, UPDATE
, DELETE
など)を書かなくても、オブジェクトの操作として直感的にデータベースを扱えます。
なぜSQLAlchemyなのか?
- Pythonの代表的なORMライブラリ SQLAlchemyはFlaskと相性が良く、多くのチュートリアルやドキュメントが整備されている。
- 複数DBに対応 SQLiteやMySQL、PostgreSQLなど様々なデータベースを同じコードベースで扱える。
- 学習コストが適度 基本を押さえればシンプルに使いつつ、複雑な要件にも対応できる拡張性がある。
2. CRUD操作の基本
データベース連携で最も重要なのが、以下4つの操作をまとめたCRUDです。
- Create : 新しいレコードの作成
- Read : 既存レコードの取得(検索)
- Update : 既存レコードの更新
- Delete : 既存レコードの削除
Webアプリでは、「ユーザがフォームに入力して送信 → DBに保存」というのがCreate、「保存したデータを画面一覧に表示」というのがRead…といった形で頻繁に使われます。

3. 実技:SQLiteを使った簡単なテーブル操作
3.1 フォルダ構成例
まずは最低限の構成を整えましょう。
以下は一例です。仮想環境(venv)を使用している前提で書いています。
flask_project/
├─ venv/ ← 仮想環境
├─ app.py ← Flaskアプリ本体
├─ models.py ← データベースのモデル定義を分離してもOK
├─ requirements.txt ← 必要ライブラリのバージョン管理
└─ templates/
├─ index.html ← 一覧表示など
└─ create.html ← 新規レコード作成用フォームなど
ポイント
app.py
にまとめてもOKですが、DBモデルが増える場合はmodels.py
として分けておくと整理しやすいです。- SQLiteでは、デフォルトで
app.db
やdata.db
のようなファイル名でDBファイルが生成される例が多いです。
3.2 ライブラリのインストール
pip install flask sqlalchemy
Flask-SQLAlchemyという拡張ライブラリもありますが、まずはSQLAlchemy単体で学習してみるのもよいでしょう。(Flask-SQLAlchemyを使うと初期設定がさらにシンプルになります。)

4. データベースとFlaskアプリをつなげる
以下では、ユーザ情報を保存する例を示します。ユーザID、名前、メールアドレスを管理するシンプルなテーブルを作りましょう。
4.1 モデル定義(models.py 例)
# models.py
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True) # 主キー
name = Column(String(50), nullable=False) # ユーザ名
email = Column(String(100), nullable=False) # メールアドレス
declarative_base()
を使うと、Pythonクラスをテーブルに対応させるORM定義を行える。__tablename__
は物理テーブル名 (users
)Column(Integer, primary_key=True)
でIDを一意に識別。String(50)
などはフィールドの最大長さの指定。nullable=False
で「必須入力」を表す。
4.2 DBエンジンとセッション作成
app.py
の起動時に、SQLiteのファイルを指定してDB接続やテーブル作成を行います。
# app.py
from flask import Flask, request, render_template, redirect, url_for
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
import os
from models import Base, User # 先ほど定義したモデル
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)
# SQLiteファイルへのパスを指定
DATABASE_URL = "sqlite:///app.db"
# DBエンジンを作成
engine = create_engine(DATABASE_URL, echo=True)
# ORMセッションを作成
Session = sessionmaker(bind=engine)
session = Session()
# 起動時にテーブルがない場合は作成 (本番ではマイグレーションツールを使うことが多い)
Base.metadata.create_all(engine)
@app.route("/")
def index():
# 全ユーザを取得
users = session.query(User).all()
return render_template("index.html", users=users)
@app.route("/create", methods=["GET", "POST"])
def create():
if request.method == "POST":
name = request.form.get("name", "").strip()
email = request.form.get("email", "").strip()
# 簡易バリデーション
if not name or not email:
return "名前とメールアドレスは必須です"
# 新規ユーザを作成 (Create)
new_user = User(name=name, email=email)
session.add(new_user)
session.commit()
return redirect(url_for("index"))
# GETの場合はフォームを表示
return render_template("create.html")
# 他にも Update, Delete のルートを追加予定
# ...
if __name__ == "__main__":
app.run(debug=True)
ポイント解説
create_engine("sqlite:///app.db")
SQLiteのファイルapp.db
を使う接続情報を作成。sessionmaker
ORMでDB操作を行うための「セッション」を作るクラス。ここで作られるsession
が、追加・検索・更新などの操作に使われる。Base.metadata.create_all(engine) models.py
で定義したクラスに対応するテーブルがまだ無ければ、自動的に作ってくれる。学習用には便利。session.query(User).all()
Read操作で全レコードを取得。session.add(new_user)
→session.commit()
新規ユーザをDBにINSERTし、コミットで確定。
4.3 テンプレート(create.html, index.html)
create.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>新規ユーザ作成</title>
</head>
<body>
<h1>ユーザを新規作成</h1>
<form method="POST" action="/create">
<div>
<label for="name">名前:</label>
<input type="text" id="name" name="name">
</div>
<div>
<label for="email">メールアドレス:</label>
<input type="email" id="email" name="email">
</div>
<button type="submit">登録</button>
</form>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ユーザ一覧</title>
</head>
<body>
<h1>ユーザ一覧</h1>
<p><a href="/create">新規ユーザ作成</a></p>
<ul>
{% for user in users %}
<li>{{ user.id }} : {{ user.name }} ({{ user.email }})
<!-- Update, Delete のリンクは後で追加予定 -->
</li>
{% endfor %}
</ul>
</body>
</html>


5. CRUDの残りの操作(Update, Delete)
5.1 Update(更新処理)
例として、ユーザ名とメールアドレスを編集する画面を作る場合。
@app.route("/edit/<int:user_id>", methods=["GET", "POST"])
def edit(user_id):
# 該当のユーザを取得
user = session.query(User).get(user_id)
if not user:
return "ユーザが見つかりません"
if request.method == "POST":
user.name = request.form.get("name", "").strip()
user.email = request.form.get("email", "").strip()
session.commit()
return redirect(url_for("index"))
# GETの場合は編集フォームを表示
return render_template("edit.html", user=user)
GET /edit/1
のようにアクセスすると、IDが1のユーザを編集するフォームを表示。POST
で編集内容を受け取り、データベースを更新する。
edit.html(例)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ユーザ編集</title>
</head>
<body>
<h1>ユーザ編集</h1>
<form method="POST" action="/edit/{{ user.id }}">
<div>
<label for="name">名前:</label>
<input type="text" id="name" name="name" value="{{ user.name }}">
</div>
<div>
<label for="email">メールアドレス:</label>
<input type="email" id="email" name="email" value="{{ user.email }}">
</div>
<button type="submit">更新</button>
</form>
</body>
</html>
5.2 Delete(削除処理)
@app.route("/delete/<int:user_id>", methods=["POST"])
def delete(user_id):
user = session.query(User).get(user_id)
if not user:
return "ユーザが見つかりません"
session.delete(user)
session.commit()
return redirect(url_for("index"))
- ボタンのクリックによるPOSTなどでユーザを削除。
- リスト画面(
index.html
)から削除用のフォームかリンクを用意する。
6. まとめ
学習のポイント
- ORMのメリット
- Pythonのコード(クラスやメソッド)でDBの操作を記述でき、SQL文の煩雑さを隠蔽できる
- DBが変わってもモデル定義を多少変えるだけで済む
- CRUD操作
- Create: 新規作成(
session.add()
) - Read: 取得(
session.query()
) - Update: フィールド更新後に
session.commit()
- Delete:
session.delete()
後にsession.commit()
- Create: 新規作成(
- SQLiteの手軽さ
sqlite:///ファイル名
という指定だけでDBを扱える- 学習やプロトタイプ用途には非常に便利
- 本番運用の場合
- MySQLやPostgreSQLと連携し、同様のORMを適用する
- データのマイグレーションツール(Alembicなど)を使い、バージョン管理する
- 接続プールの管理やスキーマ設計をしっかり行う
今後の発展
- バリデーション強化 : フォーム送信時のデータチェックをより厳密に行い、SQLAlchemyの制約(
unique=True
等)と合わせる - リレーショナルなテーブル設計 : ユーザと投稿記事の1対多など複数テーブルを扱い、JOINやリレーション機能を学ぶ
- 検索機能の拡充 :
session.query(User).filter(...)
で条件検索、ページネーション実装 etc.
これらを組み合わせることで、ユーザ登録や記事投稿、コメント機能などを備えた本格的なWebアプリケーションが作れるようになります。ぜひ、今回の学習内容を基に、次のステップへ進んでみてください!
最後に
これでFlaskとSQLAlchemyを使ったDB連携の基本(ORMとCRUD操作)がわかりました。ぜひ実際にコードを書いて、ユーザー情報の新規作成から一覧表示、編集、削除までを体験してみましょう。
プログラミングに興味があるけれど、何から始めればいいかわからない方に最適な一冊が「スッキリわかるPython入門 第2版」です。以下のポイントを参考にしてください。
本書の特徴とメリット
- シリーズ累計90万部突破
多くの読者に支持され、信頼されている大人気入門書の改訂版。 - 初心者でもわかりやすい解説
基本的な「コツ」を丁寧に説明し、迷わず学習を進められます。 - 実践的な「しくみ」の理解
プログラミングの基礎だけでなく、実際の開発に役立つ知識を習得可能。 - 「落とし穴」の回避
初心者が陥りがちな間違いをカバーし、安心して学習を進められる内容。
実際の読者の声
- 現役プログラミング教室の先生も推薦!
「この本を読んでPCスキルをマスターすれば、それでメシを食えますよ」という評価もあるほどの内容。面白くて勉強になるとの声が多い。
プログラミング教育において、多くの初学者が挫折する理由をご存じでしょうか?実は、それには多くの共通点があります。テックジムは、その問題点を深く理解し、20年以上にわたって蓄積してきた経験をもとに、誰もが安心して学べるプログラミング講座を提供しています。
テックジムは、ただの学習場ではありません。プログラミングを始めたい方や、より高いレベルに達したい方々に向けた、実践的な学びの場です。私たちが提供するカリキュラムは、初心者が直面する課題や躓きやすいポイントを徹底的に研究し、それを解決するためにデザインされています。
多くのプログラミングスクールが、フレームワークや複雑な技術から始めることで、学習者に過度な負担をかけ、結果として挫折を生む原因となっています。テックジムでは、まずは本当に重要な基礎からスタートすることで、無理なくスキルを積み上げていくことができます。例えば、関数やクラスといったプログラミングの核心部分をしっかりと理解し、それを使いこなすための時間を十分に確保しています。
これにより、受講生たちは無駄な混乱を避け、確実にスキルを身につけていくことができるのです。テックジムでの学びは、単なる知識の詰め込みではなく、実際に「できる」ことを目指した実践的なトレーニングです。
テックジムのPythonプログラミング講座は、経験と実績が詰まった講座です。初心者でも安心して参加でき、確実にステップアップできるこの講座で、あなたもプログラミングの世界に飛び込んでみませんか?
プログラミング学習に挑戦した多くの人が、途中で挫折してしまうことがあります。これは、難解なフレームワークや複雑な概念にいきなり取り組むことが主な原因です。しかし、テックジムではそのような挫折を未然に防ぐため、独自のカリキュラムを採用しています。
テックジムのカリキュラムは、まず基礎をしっかりと固めることから始めます。関数やクラスといったプログラミングの根幹をじっくり学ぶことで、無駄な負荷をかけずに確実にスキルを身につけることができます。このアプローチにより、学習者は「何をやっているのかわからない」という混乱を避け、自信を持って次のステップに進むことができます。
また、テックジムでは、段階的にスキルを積み上げることで、学習の進行に伴う負担を最小限に抑えています。その結果、無理なく、着実にプログラミングの世界で成功を収めることができるのです。
テックジムのプログラミング講座は、学ぶことの楽しさを実感しながら、挫折せずに成長できる最適な環境を提供します。
プログラミング学習において、最新技術の活用は欠かせません。テックジムでは、ChatGPTを用いた学習サポートを取り入れています。ChatGPTは、あらゆる質問に即座に答え、コードのバグ解決もスムーズにサポートします。これにより、効率的に学習を進めることが可能です。
しかし、テックジムの強みは、これだけではありません。どんなに優れたAIでも、人間のコーチによる個別サポートの価値は計り知れません。テックジムでは、経験豊富なプロのコーチがあなたの学習を支えます。プログラミングの基礎から応用まで、丁寧な指導と的確なフィードバックを提供し、あなたが抱える疑問や課題を一つ一つ解決していきます。
このように、最新の技術とプロのコーチングを組み合わせることで、テックジムでは、効率的でありながらも確実にスキルを身につけることができる学習環境を提供しています。
テックジムで学びながら、最先端のAI技術とプロの指導のベストな融合を体験してみませんか?
テックジムのPythonプログラミング講座は、その効果と実績で多くの受講生から高い評価を受けています。8月には180名を超える方々がこの講座にエントリーし、その人気と信頼の高さを証明しています。
この講座では、受講生が着実にスキルを身につけ、成長していることを実感できるカリキュラムを提供しています。プログラミングの基礎から実践的な応用まで、段階的に学べる内容は、初心者から経験者まで幅広く対応しています。また、学んだ知識をすぐに実践に移せる環境を整えており、学習の成果をリアルタイムで確認できるのも大きな特徴です。
テックジムの講座を受講した多くの方々が、「理解が深まった」「自信を持ってコードを書けるようになった」といった喜びの声を寄せています。これまでに培った経験と実績を活かし、受講生一人ひとりが成功への第一歩を踏み出せるよう全力でサポートしています。
あなたも、この成果を実感できるカリキュラムで、プログラミングスキルを確実に伸ばしてみませんか?
プログラミングに興味はあるけれど、いきなり本格的な学習に踏み出すのは少し不安…そんな方に最適なのが、テックジムの無料体験です。まずは気軽に始めてみたい、という方のために、テックジムではデモレッスンを提供しています。
この無料体験では、実際のカリキュラムの一部を体験し、学習の進め方や講師のサポートを実感することができます。受講前に「自分に合っているかどうか」を確認できるので、安心してスタートを切ることができます。
プログラミングが全く初めての方も、すでにある程度の経験を持っている方も、まずはこの無料体験で、テックジムの学びを体感してみませんか?今すぐ始める一歩が、あなたの未来を大きく変えるかもしれません。
無料体験は随時開催中です。ぜひこの機会に、新たなスキルを手に入れるための第一歩を踏み出してみてください!