Drizzle ORM入門 - SQLiteのマイグレーションを作って実行する

中級 | 25分 で読める | 2025.12.02

公式ドキュメント

今回やること

Drizzle ORMは、TypeScriptでテーブルを定義し、型の付いたSQLに近い操作を書けるORMです。ORMは、プログラムからデータベースを扱いやすくする道具です。

この記事ではSQLiteに統一し、次の流れだけを試します。

  1. tasksテーブルをTypeScriptで定義する
  2. Drizzle Kitが生成したSQLを人が確認する
  3. マイグレーションを実行する
  4. 2件を追加して読み取る

Relationsや複数テーブルは扱いません。まず、スキーマ定義と実際のSQLがつながることを確認します。

使用する安定版

2026年7月25日にnpmのlatestタグを確認した安定版は次の組み合わせです。

パッケージ安定版
drizzle-orm0.45.2
drizzle-kit0.31.10

Drizzle v1はRelease Candidateで、安定版とはAPIが異なります。この記事では@rcやv1用APIを混ぜず、上記の0.x安定版へ固定します。

前提条件

  • Node.jsとnpmが使える
  • TypeScriptとSQLの基礎を知っている
  • C/C++アドオンをbuildできる環境がある

SQLiteはサーバーを別に起動せず、1つのファイルへデータを保存できます。今回はNode.js用SQLiteドライバーbetter-sqlite3を使います。

1. プロジェクトを作る

mkdir drizzle-sqlite-practice
cd drizzle-sqlite-practice
npm init -y
npm pkg set type=module
npm install drizzle-orm@0.45.2 better-sqlite3
npm install --save-dev drizzle-kit@0.31.10 @types/better-sqlite3 tsx typescript
mkdir -p src/db

Windows PowerShellでは、最後の行の代わりに次を実行します。

New-Item -ItemType Directory -Force src/db

バージョンを確認します。

npm list drizzle-orm drizzle-kit

drizzle-orm@0.45.2drizzle-kit@0.31.10が表示されることを確認してください。

2. tasksテーブルを定義する

src/db/schema.tsを作ります。

import { integer, sqliteTable, text } from "drizzle-orm/sqlite-core";

export const tasks = sqliteTable("tasks", {
  id: integer("id").primaryKey({ autoIncrement: true }),
  title: text("title").notNull(),
  done: integer("done", { mode: "boolean" }).notNull().default(false),
});

SQLiteは真偽値専用の保存形式を持たないため、doneは整数の01として保存されます。mode: "boolean"により、TypeScript側ではbooleanとして扱えます。

3. Drizzle Kitを設定する

プロジェクト直下にdrizzle.config.tsを作ります。

import { defineConfig } from "drizzle-kit";

export default defineConfig({
  schema: "./src/db/schema.ts",
  out: "./drizzle",
  dialect: "sqlite",
  dbCredentials: {
    url: "./local.db",
  },
});
  • schemaはTypeScriptのテーブル定義
  • outは生成するSQLとスナップショットの保存先
  • dbCredentials.urlはSQLiteファイルの場所

local.dbは実行時に作られる学習データです。実際のプロジェクトではGit管理から除外します。

local.db
local.db-shm
local.db-wal

4. SQLを生成して確認する

npx drizzle-kit generate --name=init

drizzleフォルダーに.sqlファイルとスナップショットが作られます。マイグレーションは、データベース構造の変更履歴です。

生成された.sqlファイルをエディターで開き、次の要素があることを確認します。

CREATE TABLE `tasks` (
  `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
  `title` text NOT NULL,
  `done` integer DEFAULT false NOT NULL
);

空のデータベースに対する初回生成なので、tasksを作るCREATE TABLEが中心です。生成結果はバージョンにより空白や引用符が少し異なる場合があります。

SQLを確認してから、マイグレーションを適用します。

npx drizzle-kit migrate

local.dbが作られ、tasksテーブルとマイグレーション履歴が保存されます。

5. INSERTしてSELECTする

src/index.tsを作ります。

import Database from "better-sqlite3";
import { drizzle } from "drizzle-orm/better-sqlite3";
import { tasks } from "./db/schema.js";

const sqlite = new Database("./local.db");
const db = drizzle(sqlite);

await db.insert(tasks).values([
  { title: "DrizzleのSQLを確認する" },
  { title: "マイグレーションを実行する", done: true },
]);

const rows = await db.select().from(tasks);
console.table(rows);

sqlite.close();

実行します。

npx tsx src/index.ts

次のように、型の付いたオブジェクトとして2行を取得できます。

┌─────────┬────┬──────────────────────────────────┬───────┐
│ (index) │ id │ title                            │ done  │
├─────────┼────┼──────────────────────────────────┼───────┤
│ 0       │ 1  │ DrizzleのSQLを確認する           │ false │
│ 1       │ 2  │ マイグレーションを実行する       │ true  │
└─────────┴────┴──────────────────────────────────┴───────┘

成功確認

次の4点を確認できれば成功です。

  1. drizzleフォルダーにSQLが生成された
  2. 生成SQLを読み、tasksテーブルの3列を確認した
  3. npx drizzle-kit migratelocal.dbが作られた
  4. npx tsx src/index.tsで2行が表示された

2回目にsrc/index.tsを実行すると、さらに2行追加されます。最初からやり直す時は後片付けを行ってください。

後片付け

プログラムが終了し、SQLiteファイルを開いていないことを確認してから、学習データだけを削除します。

macOSまたはLinux:

rm -f local.db local.db-shm local.db-wal

Windows PowerShell:

Remove-Item local.db, local.db-shm, local.db-wal -ErrorAction SilentlyContinue

drizzleフォルダーはスキーマ変更履歴なので、実際の開発では削除せずGitで管理します。もう一度npx drizzle-kit migrateを実行すると、空のlocal.dbを作り直せます。

よくあるつまずき

better-sqlite3のインストールに失敗する

利用中のNode.jsに対応するビルド済みバイナリがない場合、OSのC/C++ビルド環境が必要です。Node.jsのLTS版を使い、better-sqlite3の導入要件を確認してください。

No config path was providedと表示される

drizzle.config.tsがプロジェクト直下にあるか、コマンドを同じフォルダーで実行しているか確認します。

pwd
ls drizzle.config.ts

Windows PowerShellでは、Get-LocationGet-Item drizzle.config.tsで確認できます。

no such table: tasksと表示される

SQLは生成しただけでは適用されません。次を実行してください。

npx drizzle-kit migrate

また、設定とプログラムがどちらも./local.dbを参照しているか確認します。

v1の記事と型やimportが合わない

この記事は0.x安定版用です。npm list drizzle-orm drizzle-kitで版を確認し、@rc@betaを追加していないか確認してください。

練習

  1. taskspriorityという整数列を追加する
  2. npx drizzle-kit generate --name=add_priorityを実行する
  3. 新しいSQLを読み、ALTER TABLEの内容を確認する
  4. 確認後にnpx drizzle-kit migrateを実行する

スキーマを変えるたびに、「生成→SQL確認→適用」の順を守ってください。

次のステップ

次は、whereによる絞り込みとupdateを追加すると、DrizzleのクエリがSQLとどう対応するか理解できます。

Relations、複数テーブル、トランザクション、PostgreSQL接続は、それぞれ別の学習ゴールとして扱いましょう。最新機能はNews記事、別のORMとの比較は各ORMの入門記事で確認してください。

参考リソース

← 一覧に戻る
PR
PR
PR
PR