付録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)入門 も、具体例つきでおすすめです。

← 目次・はじめにへもどる