Drizzleとは?TypeScriptで型安全にSQL・マイグレーションを管理する方法

Drizzleとは?TypeScriptで型安全にSQL・マイグレーションを管理する方法 開発ツール(Dev Tools)
Drizzleとは?TypeScriptで型安全にSQL・マイグレーションを管理する方法
この記事は約12分で読めます。
てんハロ運営者
てんハロ運営者

どもども
今回は「Drizzle」について解説します。

バグヲ
バグヲ

Drizzle という言葉は聞いたことあるけど、正直よくわかっていない

てんハロ運営者
てんハロ運営者

こんなあなたにピッタリな記事👇

  • SQLを型安全に書きたい
  • マイグレーションやテーブル設計をコードで管理したい
  • ちょっとした変更が面倒くさい

がまぁまぁわかります!

未経験からエンジニア転職を目指すなら
👉 テックゲート転職 をチェック!

Drizzleとは?

Drizzle(ドリズル) は、以下の2つの機能を持つツールです。

用途説明
ORM(Object Relational Mapper)JavaScript/TypeScript などから SQL(データベース)を安全に扱えるようにするツール
マイグレーションツールデータベースの構造変更をコードで管理・自動実行できるツール

つまり、「データベースの設計」や「変更」を コードで管理できる便利なツール です!

メリット

  • ✅️ TypeScriptでデータベースの列や型をコードで明確に書けて、間違いが減る
  • ✅️ テーブルの追加や変更をしたら、変更用のSQLを自動で作ってくれる
  • ✅️ コマンド1つで、SQLを書かずにデータベースが更新できる
  • ✅️ 無駄な機能が少なく、動作が速い&自由に使いやすい

Drizzleの使い方

例として、下記の流れをご紹介します。
DrizzleでSQL実行 → Dockerのmysqlに接続してテーブル確認

Dockerってなんだっけ?と思われた方は、下記の記事をご確認ください。

ステップ1:パッケージインストール

npm install drizzle-orm    # アプリの中で使う本体(DB操作・定義に使う)
npm install -D drizzle-kit  # 開発時だけ使うCLIツール(マイグレーション生成用)

npx drizzle-kit init      # 初期化コマンドも実行

これで drizzle.config.ts が作成されます。

ステップ2:drizzle.config.ts の設定

import type { Config } from "drizzle-kit";

export default {
  schema: "./src/schema", // スキーマファイルのディレクトリ
  out: "./drizzle",       // マイグレーションファイル出力先
  dialect: "mysql",       // DBの種類(mysql / pg / sqlite)
  dbCredentials: {
    host: "localhost",
    port: 3306,
    user: "root",
    password: "パスワード",
    database: "データベース名",
  },
} satisfies Config;

ステップ3:スキーマ定義

例として「ユーザー(users)が投稿(posts)を複数持てる」という関係をDrizzle を使って表現します。

テーブル名何を表す?主なカラム
usersユーザー(人)user_id, name
posts投稿(ユーザーの書き込み)post_id, user_id, title

▶ usersテーブル

// src/schema/users.ts
import { mysqlTable, varchar } from "drizzle-orm/mysql-core";
import { relations } from "drizzle-orm";
import { posts } from "./posts"; // postテーブルを読み込む

export const users = mysqlTable("users", {
  userId: varchar("user_id", { length: 36 }).primaryKey(), // ユーザーID(主キー)
  name: varchar("name", { length: 100 }), // ユーザー名
});

// ユーザーと投稿の「1対多」リレーションを定義
export const usersRelations = relations(users, ({ many }) => ({
  posts: many(posts, {
    fields: [users.userId], // usersテーブルの userId を使って
    references: [posts.userId], // postsテーブルの userId (外部キー)を参照する
  }),
}));

▶ postsテーブル

// src/schema/posts.ts
import { mysqlTable, varchar } from "drizzle-orm/mysql-core";
import { relations } from "drizzle-orm";
import { users } from "./users"; // usersテーブルを読み込む

export const posts = mysqlTable("posts", {
  postId: varchar("post_id", { length: 36 }).primaryKey(), // 投稿ID(主キー)
  userId: varchar("user_id", { length: 36 }).notNull(), // 紐づくユーザーのID(外部キー)
  title: varchar("title", { length: 255 }), // 投稿タイトル
});

// 投稿とユーザーの「多対1」リレーションを定義
export const postsRelations = relations(posts, ({ one }) => ({
  user: one(users, {
    fields: [posts.userId], // postsテーブルの userId を使って
    references: [users.userId], // usersテーブルの userId を参照する
  }),
}));

📌 リレーション設定のオプション

relations(...) を使うことで「この人が書いた投稿を全部取得する」などが簡単に設定できます。

オプション 必須 よく使う場面ざっくり説明
fields必須外部キーを指定する時自分のテーブルのカラムを書く
(例:[userId]
references必須どのテーブルのどのカラムとつなぐか相手の主キーなどを書く
(例:[users.userId]
relationName任意同じテーブルと2つ以上つなぐ時名前をつけておかないとエラーになることも

ステップ4:マイグレーションSQLファイルを生成

npx drizzle-kit generate --config ./tool/drizzle-kit/drizzle.config.ts

drizzle/0000_*.sql のようなSQLファイルが自動生成されます。

ステップ5:MySQL(Dockerコンテナ)にSQLを適用する

✍️ 方法① :生成されたSQLファイルを手動で反映

# SQLファイルが自動生成される(drizzle/0000_*.sqlみたいな)
npx drizzle-kit generate  
 
# そのSQLをDocker上のMySQLに流す
docker exec -i MySQLコンテナ名 mysql -u root -p データベース名 < ./tool/drizzle-kit/drizzle/0000_xxxx.sql

▶ 自動生成ファイルの出力場所

マイグレーションに変更があるたびに、generate → docker exec を繰り返すことでDBを更新できます。

✍️ 方法② :マイグレーションを自動で反映(推奨)

npx drizzle-kit push

npx drizzle-kit push は、src/schema などで定義された TypeScript ベースのスキーマ定義を読み取り、差分がある場合はそれを元に自動で SQL を生成し、直接データベースに反映してくれるコマンドです。

つまり、SQLファイルを手動で実行する必要がなく、マイグレーションの自動反映ができる便利な方法です。

ステップ6:テーブルを確認する

マイグレーションが正常に適用されたかどうかを確認するには、以下のコマンド・クエリでMySQLコンテナに入ってテーブル一覧を確認します。

docker exec -it MySQLコンテナ名 mysql -u root -p データベース名     # MySQLに接続
mysql> SHOW TABLES;   # テーブル一覧表示

テーブル一覧が表示され、usersposts などが存在すれば、マイグレーション成功です

SQLを流し込むのは手動と自動、どちらを使うべき?

比較項目方法①:
手動(docker exec)
方法②:
自動(drizzle-kit push)
実行対象を明示できる✅ 明確にファイル指定できる❌ 自動検出で、明示はできない
作業の簡単さ❌ コマンドで、ファイルパスやコンテナ名の指定が必要✅ ワンコマンドで完了
確認しながら進めたいとき✅ ファイル内容をチェックしやすい❌ 実行内容は見えづらい
開発中の高速な反映❌ やや手間がかかる✅ スピード感をもって作業できる

結論

  • 開発中は push を活用して効率よく反映!
  • 本番に近い環境やCIでは docker exec で明示的に制御がおすすめ!
てんハロ運営者
てんハロ運営者

おつかれさまでした!

更新をF5連打で待つの、そろそろやめませんか?
( ブログ更新をメールでそっとお知らせします🙇‍♂️ )

スパムはしません!詳細については、プライバシーポリシーをご覧ください。

コメント