Flaskのモデルクラスの書き方完全ガイド!カラム定義とリレーションを超初心者にやさしく解説
生徒
「Flaskでデータを保存するとき、どうやって構造を決めるんですか?」
先生
「FlaskではSQLAlchemyという道具を使って、モデルクラスという設計図を書いて構造を決めます。例えばエクセルの表を作るイメージです。」
生徒
「モデルクラスって何ですか?専門用語が多くてまだ分からないです...」
先生
「大丈夫!モデルクラスは“こういう名前の列(カラム)で、どんな種類の情報を入れるか”を決めるだけです。例えば“名前”“年齢”“メールアドレス”などです」
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. カラム(列)の定義方法
テーブルの中には「列(カラム)」があります。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. リレーション(関連付け)を使って複数のテーブルをつなげよう
別々のテーブルで情報を分けつつ、関係を持たせると便利です。これを「リレーション」と呼びます。SQLAlchemyではdb.relationshipとdb.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. リレーションの種類
- 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. 便利なオプションいろいろ
よく使うオプションをまとめました:
nullable=False:空っぽ禁止unique=True:重複禁止default=値:初期値を設定back_populates:相互にアクセスできるように設定lazy:遅延読み込みの方法('select'や'dynamic')
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. モデルクラス定義で初心者が陥りやすいポイント
- モデルクラスをインポートし忘れるとテーブルが作られません
ForeignKeyのテーブル名は小文字に注意(例:'user.id')back_populatesの名前のミスで関連付けが動かないことがあります
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の書き方みたいな細かな部分も忘れがちなので、注意しながら書いてみようと思います。」
先生
「小さなポイントを積み重ねることがいちばん大切です。今回学んだモデルクラスの基礎は、これからどんなアプリを作るときにも役に立ちますから、ぜひ自信を持って続きを学んでいきましょう。」