カテゴリ: Flask 更新日: 2026/02/26

Flaskのモデルクラスの書き方完全ガイド!カラム定義とリレーションを超初心者にやさしく解説

Flaskのモデルクラスの書き方!カラム定義やリレーション設定を丁寧に解説
Flaskのモデルクラスの書き方!カラム定義やリレーション設定を丁寧に解説

先生と生徒の会話形式で理解しよう

生徒

「Flaskでデータを保存するとき、どうやって構造を決めるんですか?」

先生

「FlaskではSQLAlchemyという道具を使って、モデルクラスという設計図を書いて構造を決めます。例えばエクセルの表を作るイメージです。」

生徒

「モデルクラスって何ですか?専門用語が多くてまだ分からないです...」

先生

「大丈夫!モデルクラスは“こういう名前の列(カラム)で、どんな種類の情報を入れるか”を決めるだけです。例えば“名前”“年齢”“メールアドレス”などです」

1. モデルクラスってなに?

1. モデルクラスってなに?
1. モデルクラスってなに?

モデルクラスとは、データベースに作られる表(テーブル)の“形”を決めるための設計図のことです。プログラミング未経験の方は「エクセルのシートを作るときに列名を決める感覚」と思ってもらうとイメージしやすいでしょう。

たとえば、顧客管理をするなら「名前」「メールアドレス」「電話番号」などの項目が必要になりますよね。モデルクラスでは、これらの項目をPythonのクラスの中で1つずつ定義していきます。クラスは“情報をまとめるための箱”のようなもので、この箱の中にどんな情報を入れるかを決めるのがモデルクラスの役割です。

イメージをつかみやすいように、まずはシンプルな例を見てみましょう。


# とてもシンプルな User モデルの例
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)   # 顧客番号(自動で割り当て)
    name = db.Column(db.String(50), nullable=False)  # 名前(必ず入力)

この例では「User」というテーブルを作る設計図を定義しています。idは“番号”の役割で、primary_key=Trueによって「この列はデータを識別するための特別な列ですよ」と教えています。nameはユーザーの名前で、文字列(String)を扱います。nullable=Falseを付けることで「名前は絶対に空にできない」というルールも追加しています。

モデルクラスとは、このように「どんな情報を保存するのか」「その情報にどんなルールが必要なのか」をPythonのコードとして書く仕組みです。SQL文を自分で書かなくても同じことができるため、初心者でも安心してデータベースを扱えるようになります。

2. カラム(列)の定義方法

2. カラム(列)の定義方法
2. カラム(列)の定義方法

テーブルの中には、データの内容を整理するための「列(カラム)」があります。SQLAlchemyでは、db.Columnを使ってそのカラムが「どんな種類のデータを扱うのか」「空欄を許すか」「重複してよいか」などを細かく指定できます。カラムは、エクセルでいう“列(項目名)”だと思えばイメージしやすいでしょう。


# User テーブルのサンプル
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)        # 自動番号(主キー)
    name = db.Column(db.String(50), nullable=False)     # 名前(必須)
    age = db.Column(db.Integer, default=0)              # 年齢(未入力なら0)
    email = db.Column(db.String(120), unique=True)      # メール(重複禁止)

ここで定義している内容を、初心者の方向けに噛み砕いて説明します。

  • id:1件ごとに自動で割り振られる番号。primary_key=Trueを指定すると「この列はデータの代表番号です」とSQLAlchemyに伝えることになります。
  • name:ユーザーの名前。String(50)は「最大50文字までの文字を保存できる」という意味で、nullable=Falseによって「名前は必ず入力してね」というルールがつきます。
  • age:年齢を保存する数字のカラムです。default=0を付けることで、未入力だった場合は自動的に0が入ります。
  • email:メールアドレスを保存するカラムです。unique=Trueにより、同じメールアドレスを複数のユーザーが登録することを防ぎます。

このように、カラムの定義は「どんな情報を保存するか」と「どんなルールで保存するか」を1行ずつ書いていくだけです。特にnullableuniquedefaultなどの設定を理解しておくと、より安全で使いやすいテーブルを作れるようになります。まずはこうした基本的なカラム定義から慣れていくのがおすすめです。

3. リレーション(関連付け)を使って複数のテーブルをつなげよう

3. リレーション(関連付け)を使って複数のテーブルをつなげよう
3. リレーション(関連付け)を使って複数のテーブルをつなげよう

別々のテーブルで情報を分けつつ、関係を持たせると便利です。これを「リレーション」と呼びます。SQLAlchemyでは
db.relationshipdb.ForeignKeyで設定します。


class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    body = db.Column(db.Text, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

    user = db.relationship('User', back_populates='posts')

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)

    posts = db.relationship('Post', back_populates='user', lazy='dynamic')

ここでは「User(ユーザー)」と「Post(記事)」をつなげています。

db.ForeignKey('user.id')は「このカラムはUserのidとつながる」という意味です。

db.relationship('User')は「Pythonクラスの中で関係を表現するための魔法のようなもの」です。

4. リレーションの種類

4. リレーションの種類
4. リレーションの種類
  • 1対多(One‑to‑Many):1人のユーザーに複数記事。上記の例がこれ。
  • 多対多(Many‑to‑Many):学生と授業の関係など。中間テーブルを使って紐付けます。

多対多の例はこちら:


tags = db.Table('tags',
    db.Column('post_id', db.Integer, db.ForeignKey('post.id')),
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
)

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    tags = db.relationship('Tag', secondary=tags, back_populates='posts')

class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(30), unique=True)
    posts = db.relationship('Post', secondary=tags, back_populates='tags')

5. 便利なオプションいろいろ

5. 便利なオプションいろいろ
5. 便利なオプションいろいろ

よく使うオプションをまとめました:

  • nullable=False:空っぽ禁止
  • unique=True:重複禁止
  • default=値:初期値を設定
  • back_populates:相互にアクセスできるように設定
  • lazy:遅延読み込みの方法('select''dynamic'

6. モデルクラスを書いた後は?テーブル作成の流れ

6. モデルクラスを書いた後は?テーブル作成の流れ
6. モデルクラスを書いた後は?テーブル作成の流れ

① モデルクラスを作る(例:User, Post, Tag)
② Flaskアプリの中でSQLAlchemyを使い db.create_all() を実行
③ SQLiteのファイル(example.db)にテーブルが作成されます

以下はサンプルコードです:


from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
db = SQLAlchemy(app)

# model定義(User, Postなど)

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

7. モデルクラス定義で初心者が陥りやすいポイント

7. モデルクラス定義で初心者が陥りやすいポイント
7. モデルクラス定義で初心者が陥りやすいポイント
  • モデルクラスをインポートし忘れるとテーブルが作られません
  • ForeignKeyのテーブル名は小文字に注意(例:'user.id')
  • back_populatesの名前のミスで関連付けが動かないことがあります

8. なぜモデルクラスが重要?

8. なぜモデルクラスが重要?
8. なぜモデルクラスが重要?

Pythonのクラスでテーブルを定義することで、SQL(エスキューエル:データベース操作の言葉)を書かずにデータ操作できます。これを「ORM(オーアールエム)」と呼びます。難しいSQL文を覚えなくても、Pythonのコードだけでデータベース操作ができるようになります。

まとめ

まとめ
まとめ

ふりかえってみると、Flaskでモデルクラスを定義するという作業は、最初は専門用語が多くてとっつきにくいように見えますが、実際には「どんな情報を保存したいかを一つずつ整理して並べていく」というとても素朴な作業です。とくに、名前や年齢やメールアドレスといった日常的に目にする項目を、ていねいにクラスとして形づくっていくことで、データベースという仕組みが一気に身近な存在になります。こうした整理と設計の考え方は、フレームワークを使った開発ではかならずと言ってよいほど必要になるため、ひとつずつ確かめながら理解していくことがたいせつです。 さらに、単なる情報の並びだけではなく、複数のテーブル同士がつながるリレーションという考え方まで押さえることで、より現実に近いデータ構造を自然にあつかえるようになります。ひとりのユーザーが複数の記事をもつ、複数のタグを共有する記事が存在する、といった場面に合わせて、関連付けを思い描きながらモデルを組み立てると、データの世界がぐっと立体的に見えてきます。こうした関連付けを理解することは、アプリケーションの設計だけでなく、後々の機能追加や運用にも深く関わってきます。 また、モデルクラスをしっかり定義したあとは、実際にテーブルを作成して動作を確かめていく必要があります。SQLAlchemyのdb.create_all()を用いてテーブルを生成する手順はとてもわかりやすく、はじめての人でも確実に動作を確認できる流れになっています。こうした「定義して、生成して、動かしてみる」という一連のステップをていねいに踏むことで、プログラムとデータベースがどのように結びついているのかが、自然と理解できるようになります。 さらに、見落としやすいポイントをひとつひとつ確かめておくことで、エラーを未然に防ぎ、スムーズな開発を続けることができます。たとえば、モデルの読み込み忘れ、ForeignKeyのテーブル名の記述ゆれ、back_populatesのつづりミスなどは、とてもよくあるものですが、あらかじめ意識しておくことで大きな混乱を避けることができます。こうした小さなつまずきに気づけるようになるのも、実際にコードを書き進めるうちに身についていく習慣です。 最後に、Pythonのクラスでデータベースを操作できるORMの仕組みは、これからさまざまなアプリケーションを作っていくうえで欠かせない基盤となります。複雑なSQLを意識しなくても、必要な操作を自然なコードで表現できるというのは、初学者にとってもベテラン開発者にとっても大きな助けとなります。モデルクラスの理解が深まるほど、アプリの世界がどんどん広がっていきますので、今回の学びをぜひじっくり積み上げていってください。

サンプルプログラムでもう一度確認しよう

ここでは基本的なユーザーモデルと記事モデルを組み合わせたシンプルな例をまとめとして掲載します。


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)
    email = db.Column(db.String(120), unique=True)
    posts = db.relationship('Post', back_populates='user', lazy='dynamic')

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    body = db.Column(db.Text, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    user = db.relationship('User', back_populates='posts')
先生と生徒の振り返り会話

生徒

「きょうの内容で、とくにリレーションの考え方がすごくよくわかりました。いままでは何となくむずかしそうだと思っていたんですが、具体的な場面を想像するとすんなり理解できました。」

先生

「そうですね。複数のデータがどんな関係にあるのかをイメージできると、モデル設計は一気に楽になりますよ。カラムの意味や関連付けの方向を意識するだけで、コードも読みやすく整理できるようになります。」

生徒

「あと、ForeignKeyの書き方みたいな細かな部分も忘れがちなので、注意しながら書いてみようと思います。」

先生

「小さなポイントを積み重ねることがいちばん大切です。今回学んだモデルクラスの基礎は、これからどんなアプリを作るときにも役に立ちますから、ぜひ自信を持って続きを学んでいきましょう。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Flaskでモデルクラスを使う理由はなんですか?初心者にもわかりやすく教えてください。

Flaskでモデルクラスを使う理由は、データベースのテーブルをPythonのクラスとして表現し、データの保存や操作を簡単にするためです。難しいSQL文を直接書かずに、Pythonのコードだけでデータベースとやりとりできる仕組み(ORM)があるため、初心者でも直感的に理解しやすい構成になります。

SQLAlchemyのdb.Columnは何をするために使いますか?

SQLAlchemyのdb.Columnは、モデルクラスの中でデータベースのカラム(列)を定義するために使います。たとえば、名前や年齢、メールアドレスなどの情報を入れるために、それぞれの列に対応する項目をPythonコードで指定します。
カテゴリの一覧へ
新着記事
New1
Flask
Flaskでマイグレーション管理を始めよう!Flask-Migrateの使い方と手順
New2
Django
Djangoの逆引きURL(reverse)とは?初心者でもわかるURLルーティング入門
New3
Flask
Flaskアプリのメモリ使用量を最適化!初心者でもできる軽量化の裏技集
New4
Flask
FlaskでリダイレクトやURL生成を行う方法!便利な関数の使い方を解説
人気記事
No.1
Java&Spring記事人気No1
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.2
Java&Spring記事人気No2
Flask
FlaskのBlueprintとは?機能ごとに分割して管理する基本設計を学ぼう
No.3
Java&Spring記事人気No3
Python
PythonでSQLデータベースのパフォーマンスを向上させる方法|初心者でもわかる高速化の基本
No.4
Java&Spring記事人気No4
Python
Pythonのリストを分割する方法を完全ガイド!初心者でもわかるスライス・split・itertoolsの使い方
No.5
Java&Spring記事人気No5
Flask
Flaskでデータベースエラーを処理する方法!初心者にもわかる例外の使い方
No.6
Java&Spring記事人気No6
Flask
Flaskとは何か?初心者向けにできること・特徴・インストール手順までやさしく解説
No.7
Java&Spring記事人気No7
Flask
Flaskアプリのテスト性を高める設計方法まとめ
No.8
Java&Spring記事人気No8
Python
Pythonで仮想環境(venv)を作る方法!初心者向けに環境構築をステップ解説