カテゴリ: Flask 更新日: 2025/12/14

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を使ってカラムを定義します。


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)
    email = db.Column(db.String(120), unique=True)
  • id:データの番号(主キー、primary_key)
  • name:名前(文字列、最大50文字、空不可)
  • age:年齢(数字、初期値0)
  • email:メール(文字列、重複不可)

nullable=Falseは「空にできない」、unique=Trueは「他と重複しない」という意味です。

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)があるため、初心者でも直感的に理解しやすい構成になります。
カテゴリの一覧へ
新着記事
New1
Flask
Flaskのログレベル(DEBUG/INFO/WARNING/ERROR)を使い分ける方法を完全ガイド!
New2
Python
Pythonのfrozensetとは?ミュータブルなsetとの違いをわかりやすく解説
New3
Python
Pythonでセットを活用してデータをフィルタリングする方法!初心者でもわかるセットの基本と使い方
New4
Python
Pythonの辞書操作まとめ!初心者が知っておくべき便利ワザ集
人気記事
No.1
Java&Spring記事人気No1
Python
Pythonの文字列から一部を抽出する方法!スライスを使った基本的な切り出し方
No.2
Java&Spring記事人気No2
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.3
Java&Spring記事人気No3
Flask
FlaskアプリのSECRET_KEYの設定方法を完全ガイド!初心者でもわかるセキュリティ対策
No.4
Java&Spring記事人気No4
Django
Djangoモデル入門|初心者が最初に知るべきORMの基本操作
No.5
Java&Spring記事人気No5
Flask
Flaskで非同期処理を成功させるベストプラクティス集|初心者でも失敗しない考え方
No.6
Java&Spring記事人気No6
Python
Pythonのリストを分割する方法を完全ガイド!初心者でもわかるスライス・split・itertoolsの使い方
No.7
Java&Spring記事人気No7
Flask
Flaskでデータベースを使う基本!SQLAlchemyの導入方法をやさしく解説
No.8
Java&Spring記事人気No8
Flask
Flaskのログをファイルに保存する方法!初心者でもわかる設定手順を徹底解説