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
2k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
SQLModel 入門
SQLModel 入門
### PydanticとSQLAlchemyの"いいとこ取り"!
MIKIO KUBO
July 03, 2025
More Decks by MIKIO KUBO
See All by MIKIO KUBO
人工知能の歴史: チューリングからエージェントスキルに至る道程}
mickey_kubo
0
120
AlgorithAlgorihms for Decision Making
mickey_kubo
0
140
エージェントスキル:自律型AIが変える最適化とサプライチェーンの未来
mickey_kubo
0
210
エージェントスキルによる最適化
mickey_kubo
2
220
Agent Skills 完全ガイド
mickey_kubo
0
200
Skill Creatorの技術設計と動作原理
mickey_kubo
0
190
AI+SCM
mickey_kubo
0
120
エージェンティック・サプライチェーン」の概念と、製造業におけるその革新的な役割について解説
mickey_kubo
0
120
MOAI Solutionの紹介 -電力最適化を中心として-
mickey_kubo
0
140
Other Decks in Programming
See All in Programming
【デモ】Kiroで体験する仕様駆動開発|設計からコーディングまでAIと進める開発フロー
cmkudo
0
590
Can LLMs Replicate 4 Years of Compose Migration? Exploring the boundaries of automation with 279 XML files from a real product
makun
0
130
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
120
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
0
240
ソフトウェアラスタライザ
fadis
1
790
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
110
私のClaude Code活用法 (個人開発編) - PHPerKaigi mini #4(2026/08/24)
panda_program
1
210
信頼性の目標を誰も求めてない
shubox
0
490
Laravelのアプリケーションをどこにデプロイするか #ツナギメオフライン.9
akase244
0
120
Building an Out-of-Order CPU
latte72
0
710
Hono + Inertia + React で LP を構築した話
oukayuka
2
220
業務時間外もAIに働いてもらう話
colorful12
3
10k
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Producing Creativity
orderedlist
PRO
348
41k
Statistics for Hackers
jakevdp
799
230k
Are puppies a ranking factor?
jonoalderson
2
3.9k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
For a Future-Friendly Web
brad_frost
183
10k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
400
Ruling the World: When Life Gets Gamed
codingconduct
0
320
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
770
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
510
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
440
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