今回やること
Drizzle ORMは、TypeScriptでテーブルを定義し、型の付いたSQLに近い操作を書けるORMです。ORMは、プログラムからデータベースを扱いやすくする道具です。
この記事ではSQLiteに統一し、次の流れだけを試します。
tasksテーブルをTypeScriptで定義する- Drizzle Kitが生成したSQLを人が確認する
- マイグレーションを実行する
- 2件を追加して読み取る
Relationsや複数テーブルは扱いません。まず、スキーマ定義と実際のSQLがつながることを確認します。
使用する安定版
2026年7月25日にnpmのlatestタグを確認した安定版は次の組み合わせです。
| パッケージ | 安定版 |
|---|---|
drizzle-orm | 0.45.2 |
drizzle-kit | 0.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.2とdrizzle-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は整数の0と1として保存されます。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点を確認できれば成功です。
drizzleフォルダーにSQLが生成された- 生成SQLを読み、
tasksテーブルの3列を確認した npx drizzle-kit migrateでlocal.dbが作られた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-LocationとGet-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を追加していないか確認してください。
練習
tasksへpriorityという整数列を追加するnpx drizzle-kit generate --name=add_priorityを実行する- 新しいSQLを読み、
ALTER TABLEの内容を確認する - 確認後に
npx drizzle-kit migrateを実行する
スキーマを変えるたびに、「生成→SQL確認→適用」の順を守ってください。
次のステップ
次は、whereによる絞り込みとupdateを追加すると、DrizzleのクエリがSQLとどう対応するか理解できます。
Relations、複数テーブル、トランザクション、PostgreSQL接続は、それぞれ別の学習ゴールとして扱いましょう。最新機能はNews記事、別のORMとの比較は各ORMの入門記事で確認してください。
参考リソース
- Drizzle公式: Get started
- Drizzle公式: SQLite
- Drizzle公式: generate
- Drizzle公式: migrate
- npm: drizzle-orm
- npm: drizzle-kit