Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
SQLModel 入門
Search
MIKIO KUBO
July 03, 2025
Programming
0
1.1k
SQLModel 入門
SQLModel 入門
### PydanticとSQLAlchemyの"いいとこ取り"!
MIKIO KUBO
July 03, 2025
Tweet
Share
More Decks by MIKIO KUBO
See All by MIKIO KUBO
The Fusion of Mathematical Optimization and AI (MOAI): History and Outlook (Final Version)
mickey_kubo
0
50
The Fusion of Mathematical Optimization and AI (MOAI): History and Outlook (Short Version)
mickey_kubo
1
42
The Fusion of Mathematical Optimization and AI (MOAI): History and Outlook
mickey_kubo
1
77
History and Future of MO+AI
mickey_kubo
1
71
History and Future of MO+AI (Fusion of Mathematical Optimization and Artificial Intelligence)
mickey_kubo
1
35
Next.js 入門解説: Reactとの決定的な違いとApp Routerに基づくモダンWeb開発
mickey_kubo
1
120
Google Antigravity and Vibe Coding: Agentic Development Guide
mickey_kubo
5
370
React完全入門
mickey_kubo
1
110
TypeScript初心者向け完全ガイド
mickey_kubo
1
120
Other Decks in Programming
See All in Programming
AtCoder Conference 2025
shindannin
0
1.1k
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
2.4k
Architectural Extensions
denyspoltorak
0
280
SourceGeneratorのススメ
htkym
0
190
AIによる開発の民主化を支える コンテキスト管理のこれまでとこれから
mulyu
3
210
Basic Architectures
denyspoltorak
0
670
AI時代の認知負荷との向き合い方
optfit
0
160
Smart Handoff/Pickup ガイド - Claude Code セッション管理
yukiigarashi
0
130
疑似コードによるプロンプト記述、どのくらい正確に実行される?
kokuyouwind
0
380
[KNOTS 2026登壇資料]AIで拡張‧交差する プロダクト開発のプロセス および携わるメンバーの役割
hisatake
0
270
Implementation Patterns
denyspoltorak
0
280
dchart: charts from deck markup
ajstarks
3
990
Featured
See All Featured
Claude Code のすすめ
schroneko
67
210k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
450
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
300
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
57
50k
The Pragmatic Product Professional
lauravandoore
37
7.1k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
240
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
930
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.2k
WENDY [Excerpt]
tessaabrams
9
36k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
63
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.2k
Transcript
SQLModel 入門 Pydantic とSQLAlchemy の" いいとこ取り" ! 1
このスライドで学べること SQLModel とは何か? なぜ便利なのか? これまでのデータベース操作の 課題点 SQLModelを使った 基本的なCRUD 操作 (作成,
読取, 更新, 削除) リレーションシップ(テーブル間の連携)の扱い方 FastAPIと連携した実践的なWebアプリケーション開発 ゴール:このスライドだけでSQLModel の基本をマスターし、アプリ開発に活かせるようになる! 2
SQLModel ってなに? 一言でいうと、Pydantic と SQLAlchemy を融合させたライブラリです。 ライブラリ 役割 Pydantic データのバリデーション(検証)と設定管理。型ヒントでデータ構造を定義。
SQLAlchemy Pythonでデータベースを操作するためのORM (Object-Relational Mapper)。 **SQLModel** は、この2つの長所を組み合わせることで、**1つのクラス定義**で**データベース のテーブル構造**と**APIなどで使うデータモデル**の両方を表現できるようにしたものです。 開発者は、WebフレームワークFastAPIの作者でもある Sebastián Ramírez (tiangolo) 氏です。 3
これまでの課題:モデル定義の重複 SQLModelがない世界では、データベース用のモデルと、APIでやり取りするためのデータモデルを 別々に定義する必要がありました。 # データベース用 (SQLAlchemy) class UserDB(Base): __tablename__ =
'users' id = Column(Integer, primary_key=True) name = Column(String) email = Column(String) # API用 (Pydantic) class UserSchema(BaseModel): id: int name: str email: str 似たような定義が2つあり、 コードが冗長になる。 片方を修正したら、もう片方も修正する必要があり、 メンテナンスが大変。 4
SQLModel が解決すること:DRY (Don't Repeat Yourself) SQLModelを使えば、モデル定義は たった1 つで済みます。 # SQLModelなら、これでOK!
from sqlmodel import SQLModel, Field class User(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) name: str email: str SQLModel を継承し、Pydanticのように型ヒントでクラスを定義します。 table=True をつけることで、このクラスがデータベースのテーブル定義でもあることを示し ます。 コードがシンプルになり、 バグが減り、 開発効率が大幅に向上します! 5
準備をしよう:インストール まずは、必要なライブラリをインストールします。このスライドのコードは sqlmodel だけで動作し ます。 # ターミナルで実行 pip install sqlmodel
もし、FastAPIと連携するWebサーバーを動かす場合は、以下もインストールします。 ```bash pip install "fastapi[all]" ``` 6
Step 1: モデルを定義する Hero (ヒーロー)という情報を持つテーブルを作成してみましょう。 heroes.py from typing import Optional
from sqlmodel import Field, SQLModel # SQLModelを継承してモデルクラスを作成 # "table=True" で、これがDBのテーブルに対応することを示す class Hero(SQLModel, table=True): # カラム(属性)を定義 # id: 主キー(primary_key=True)。データ作成時はNoneでもOK id: Optional[int] = Field(default=None, primary_key=True) # name: 文字列型。index=Trueで検索が高速に name: str = Field(index=True) # secret_name: 文字列型 secret_name: str # age: 整数型。NoneでもOK。index=True age: Optional[int] = Field(default=None, index=True) 7
Step 2: データベースエンジンを作成する データベースとの接続を管理する「エンジン」を作成します。 ここでは、手軽なSQLiteを使います。(ファイルベースのDB) database.py from sqlmodel import create_engine
# SQLiteデータベースファイルの名前 sqlite_file_name = "database.db" # データベースURL sqlite_url = f"sqlite:///{sqlite_file_name}" # データベースエンジンを作成 # echo=Trueにすると、実行されたSQLクエリがコンソールに表示される engine = create_engine(sqlite_url, echo=True) 8
Step 3: テーブルを作成する 定義したモデル( Hero クラス)を元に、データベース内にテーブルを物理的に作成します。 main.py from sqlmodel import
SQLModel # 他のファイルからimport from database import engine from models import Hero # 先ほど定義したHeroクラス def create_db_and_tables(): # Heroモデルを含む、SQLModel.metadataに登録された # 全てのテーブルを作成する SQLModel.metadata.create_all(engine) # この関数を一度だけ実行すればテーブルが作られる if __name__ == "__main__": create_db_and_tables() print("データベースとテーブルが作成されました。") 9
Step 4: データを作成する (Create) Session を通じてデータベースと対話します。 Session は、DB操作の一連のまとまり(トランザク ション)を管理します。 main.py
# ... (import文は省略) ... from sqlmodel import Session def create_heroes(): # モデルのインスタンスを作成 hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson") hero_2 = Hero(name="Spider-Boy", secret_name="Pedro Parqueador") hero_3 = Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48) # "with"構文でSessionを作成。ブロックを抜けると自動でクローズされる with Session(engine) as session: # 作成したインスタンスをセッションに追加 session.add(hero_1) session.add(hero_2) session.add(hero_3) # データベースに変更を保存(確定) session.commit() 10
Step 5: データを読み取る (Read) select() 関数でクエリを作成し、 session.exec() で実行します。 main.py #
... (import文は省略) ... from sqlmodel import select def select_heroes(): with Session(engine) as session: # Heroテーブルから全件取得するクエリを作成 statement = select(Hero) # クエリを実行し、結果を取得 heroes = session.exec(statement).all() # all()で全件をリストとして取得 for hero in heroes: print(hero) print("-" * 20) # 条件を指定して読み取る (where) statement_filtered = select(Hero).where(Hero.name == "Spider-Boy") hero = session.exec(statement_filtered).first() 11
Step 6: データを更新する (Update) 1. 更新したいデータをまず 読み取ります。 2. オブジェクトの属性値を変更します。 3.
セッションに追加して commit します。 main.py def update_hero(): with Session(engine) as session: # 更新対象のデータを取得 statement = select(Hero).where(Hero.name == "Spider-Boy") hero_to_update = session.exec(statement).one() # 1件だけ取得 # 属性値を変更 hero_to_update.age = 16 print("Updated hero (before commit):", hero_to_update) # セッションに追加してcommit session.add(hero_to_update) session.commit() # DBから最新の状態をオブジェクトに反映 12
Step 7: データを削除する (Delete) 1. 削除したいデータをまず 読み取ります。 2. session.delete() で削除対象を指定します。
3. commit して変更を確定します。 main.py def delete_hero(): with Session(engine) as session: # 削除対象のデータを取得 statement = select(Hero).where(Hero.name == "Deadpond") hero_to_delete = session.exec(statement).first() if hero_to_delete: # データを削除 session.delete(hero_to_delete) session.commit() print("Deleted hero:", hero_to_delete) else: print("Hero not found.") 13
発展: リレーションシップ (1 対多) チーム(Team)とヒーロー(Hero)の関係を定義してみましょう。1つのチームに複数のヒーローが所属 します。 from typing import List,
Optional from sqlmodel import Field, Relationship, SQLModel class Team(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) name: str = Field(index=True) headquarters: str # "heroes"はこのチームに所属するHeroのリスト # back_populatesでお互いの関係性を紐付ける heroes: List["Hero"] = Relationship(back_populates="team") class Hero(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) name: str = Field(index=True) secret_name: str age: Optional[int] = Field(default=None, index=True) # team_id: 外部キー。Teamテーブルのidを参照 team_id: Optional[int] = Field(default=None, foreign_key="team.id") # "team"はこのヒーローが所属するTeamオブジェクト team: Optional[Team] = Relationship(back_populates="heroes") 14
まとめ SQLModel は、Pydantic とSQLAlchemy の強力な機能をシンプルにまとめたライブラリ。 モデル定義を1 つに集約でき、DRYなコーディングが可能になる。 SQLModel , Field
, create_engine , Session , select が基本要素。 基本的なCRUD 操作 -Create(作成)、Read(読み取り)、Update(更新)、Delete(削除)- から リレーションシップまで直感的に扱える。 特にFastAPI との相性は抜群で、堅牢で効率的なWeb APIを素早く構築できる。 今日からあなたのPythonプロジェクトにSQLModelを取り入れてみましょう! 公式ドキュメント: https://sqlmodel.tiangolo.com/ 15
Q & A ご清聴ありがとうございました。 16