付録A ORマッパー(ORM)とアダプタ(ドライバ)— コードからDBを扱う道具
📖 このページのゴール:DB と「自分のプログラム」をつなぐ道具——ドライバ(アダプタ)/クエリビルダ/ORM——の違いと、使いどころ・落とし穴がわかる。 ← 目次・はじめにへもどる
ここまでは「データをどこに置くか」の話でした。この付録は、置いたデータをコードからどう読み書きするかの道具の話です。本編の脇道なので、必要になったら読めばOKです(🔧 応用)。
🗣 たとえ:DBの言葉(SQL)の「通訳」
DB(とくにRDB)は SQL という専用の言葉でやりとりします。でも毎回SQLを手で書くのは大変だし、間違えるとバグや事故になります。そこで、自分のプログラミング言語のまま書くと、SQLに通訳してくれる道具が生まれました。通訳のレベルが3段階あります。
あなたのコード
│
├─ ③ ORM … 「テーブル=オブジェクト」。SQLをほぼ書かない(いちばん楽・抽象的)
├─ ② クエリビルダ … メソッドを組み立ててSQLを作る(中間。SQLが透けて見える)
└─ ① ドライバ/アダプタ … 生のSQLをそのままDBへ送る土管(いちばん低レベル・自由)
▼
データベース
① ドライバ(アダプタ)— DBと実際に通信する土管
ドライバ(driver、別名アダプタ)は、DBと実際に通信する一番下の部品です。これが無いと、そもそもDBにつながりません。ORMやクエリビルダも、内部ではこのドライバを使っています。
| DB | 代表的なドライバ(Node.js の例) |
|---|---|
| PostgreSQL | pg(node-postgres) |
| MySQL | mysql2 |
| SQLite | better-sqlite3 |
- 1行ずつ読むと:これらは「生のSQLを送って、結果を受け取る」だけのシンプルな部品。自由度は最高ですが、SQLは自分で書きます。
② クエリビルダ — SQLをコードで“組み立てる”
クエリビルダは、.select() .where() のようなメソッドをつないでSQLを組み立てる道具。SQLが透けて見えるので、何が起きるか分かりやすいのが利点。
- 代表:Knex / Kysely / Drizzle(型安全で人気)。
- 「ORMほど隠しすぎず、生SQLほど手間でもない」ちょうど中間です。
③ ORM(オーアールマッパー)— テーブルをオブジェクトとして扱う
ORM(Object-Relational Mapper=オブジェクト関係マッピング)は、DBのテーブルを、コードの「オブジェクト(もの)」として扱えるようにする道具。user.save() のように書くと、裏でSQLが発行されます。SQLをほとんど書かずに済むのが最大の魅力。
| 言語 | 代表的なORM |
|---|---|
| TypeScript / JavaScript | Prisma / Drizzle / TypeORM / Sequelize |
| Python | SQLAlchemy / Django ORM |
| Ruby | ActiveRecord(Rails) |
| Go | GORM |
💡 Supabase のクライアント(supabase-js) は、正確には ORM ではなく、自動生成API(PostgREST)の上に乗ったクエリビルダ寄りの道具です(
supabase.from('users').select()のように書く)。詳しくは 付録B。
⚖️ 生SQL / クエリビルダ / ORM くらべ
| 書きやすさ | 何が起きるか分かりやすい | 複雑なSQLの自由度 | 型安全 | |
|---|---|---|---|---|
| 生SQL(ドライバ) | △ 手間 | ◎ そのまま | ◎ なんでも | ✕(文字列) |
| クエリビルダ | ○ | ○ 透けて見える | ○ | ○ |
| ORM | ◎ 楽 | △ 隠れる | △ 苦手なことも | ◎ |
⚠️ ハマりどころ(とくにORM)
- N+1問題(エヌプラスいち):一覧を取ったあと、1件ごとに関連データを取りにいって、クエリが何十回も飛ぶこと。気づかないと激遅。→「まとめて取る(JOIN / include / eager loading)」で直す。
- 抽象の漏れ:ORMは便利だけど、裏で出るSQLを知らないと、遅さや事故の原因がわからなくなります。生成されるSQLを読めるくらいのSQL知識は持っておくのが結局いちばんの近道。
- 複雑なクエリが書きにくい:凝った集計・ウィンドウ関数などは、ORMより生SQLの方が素直なことも。多くのORMは「生SQLに逃げる」口(escape hatch)を用意しています。
- マイグレーション:テーブルの設計変更(列を足す等)を履歴として管理するしくみ。ORM付属のものを使うと安全に変更できます。
🟢 ひとことで言うと
ドライバ=土管/クエリビルダ=SQLを組み立てる/ORM=テーブルをオブジェクトに。ORMは生産性が高くおすすめですが、裏で出るSQLを読める程度のSQL力と、N+1への注意はセットで。迷ったら、型安全で人気の Prisma / Drizzle(TS) あたりから。
🔗 関連:姉妹教材「Twitterクローンで学ぶWeb開発入門」の 付録D ORマッパー(ORM)入門 も、具体例つきでおすすめです。