Drizzle ORM - TypeScript製の軽量ORM

2025.12.01

公式ドキュメント

Drizzle ORMとは

Drizzle ORMは、TypeScriptファーストで設計された軽量なORMです。SQLに近い構文で直感的にクエリを書け、完全な型安全性を提供します

特徴

主な特徴:

  • TypeScript ファースト
  • SQLに近い構文
  • ゼロ依存(軽量)
  • Edge対応
  • サーバーレス最適化

スキーマ定義

ポイント: Drizzleではスキーマ定義もTypeScriptで記述するため、IDEの補完やリファクタリングの恩恵を受けられます。

テーブル定義

// schema.ts
import { pgTable, serial, text, timestamp, integer, boolean } from 'drizzle-orm/pg-core';

export const users = pgTable('users', {
 id: serial('id').primaryKey(),
 name: text('name').notNull(),
 email: text('email').notNull().unique(),
 createdAt: timestamp('created_at').defaultNow()
});

export const posts = pgTable('posts', {
 id: serial('id').primaryKey(),
 title: text('title').notNull(),
 content: text('content'),
 authorId: integer('author_id').references(() => users.id),
 published: boolean('published').default(false),
 createdAt: timestamp('created_at').defaultNow()
});

リレーション定義

import { relations } from 'drizzle-orm';

export const usersRelations = relations(users, ({ many }) => ({
 posts: many(posts)
}));

export const postsRelations = relations(posts, ({ one }) => ({
 author: one(users, {
 fields: [posts.authorId],
 references: [users.id]
 })
}));

クエリビルダー

基本的なCRUD

import { drizzle } from 'drizzle-orm/node-postgres';
import { eq, and, or, gt, like } from 'drizzle-orm';
import * as schema from './schema';

const db = drizzle(pool, { schema });

// INSERT
const newUser = await db.insert(users).values({
 name: 'Alice',
 email: 'alice@example.com'
}).returning();

// SELECT
const allUsers = await db.select().from(users);

// WHERE
const activeUsers = await db.select()
 .from(users)
 .where(eq(users.isActive, true));

// UPDATE
await db.update(users)
 .set({ name: 'Bob' })
 .where(eq(users.id, 1));

// DELETE
await db.delete(users)
 .where(eq(users.id, 1));

複雑なクエリ

// 複数条件
const results = await db.select()
 .from(users)
 .where(
 and(
 gt(users.age, 18),
 or(
 like(users.email, '%@company.com'),
 eq(users.role, 'admin')
 )
 )
 );

// ORDER BY, LIMIT, OFFSET
const pagedUsers = await db.select()
 .from(users)
 .orderBy(desc(users.createdAt))
 .limit(10)
 .offset(20);

// JOIN
const postsWithAuthors = await db.select({
 postTitle: posts.title,
 authorName: users.name
})
 .from(posts)
 .leftJoin(users, eq(posts.authorId, users.id));

実践メモ: リレーショナルクエリを使うと、Prismaのような with 構文でネストしたデータを簡単に取得できます。

リレーショナルクエリ

// ネストしたデータを取得
const usersWithPosts = await db.query.users.findMany({
 with: {
 posts: {
 where: eq(posts.published, true),
 limit: 5
 }
 }
});

// 結果
// [
// {
// id: 1,
// name: 'Alice',
// posts: [
// { id: 1, title: 'First Post', ... },
// { id: 2, title: 'Second Post', ... }
// ]
// }
// ]

トランザクション

await db.transaction(async (tx) => {
 const user = await tx.insert(users)
 .values({ name: 'Alice', email: 'alice@example.com' })
 .returning();

 await tx.insert(posts).values({
 title: 'My First Post',
 authorId: user[0].id
 });
});

マイグレーション

ポイント: Drizzle Kitはマイグレーション生成・適用・GUIスタジオを提供する公式CLIツールです。

Drizzle Kit

# マイグレーション生成
npx drizzle-kit generate

# マイグレーション適用
npx drizzle-kit migrate

# スキーマをDBにプッシュ(開発用)
npx drizzle-kit push

# Drizzle Studio(GUI)
npx drizzle-kit studio

設定ファイル

// drizzle.config.ts
import type { Config } from 'drizzle-kit';

export default {
 schema: './src/schema.ts',
 out: './drizzle',
 dialect: 'postgresql',
 dbCredentials: {
 url: process.env.DATABASE_URL!
 }
} satisfies Config;

注意: データベースドライバのインポートパスはDB種別によって異なります。プロジェクト初期に正しいパッケージを選択しましょう

各種データベース対応

// PostgreSQL
import { drizzle } from 'drizzle-orm/node-postgres';

// MySQL
import { drizzle } from 'drizzle-orm/mysql2';

// SQLite
import { drizzle } from 'drizzle-orm/better-sqlite3';

// Planetscale
import { drizzle } from 'drizzle-orm/planetscale-serverless';

// Neon
import { drizzle } from 'drizzle-orm/neon-http';

// Turso
import { drizzle } from 'drizzle-orm/libsql';

Prismaとの比較

観点DrizzlePrisma
構文SQLに近い独自DSL
バンドルサイズ小さい大きい
マイグレーションコード生成Prisma Migrate
エッジ対応ネイティブPrisma Accelerate
学習コストSQLを知っていれば低いPrisma構文を学ぶ必要

まとめ

Drizzle ORMは、SQLに近い構文と完全な型安全性を両立した軽量なORMです。エッジ環境やサーバーレスに最適化されており、モダンなTypeScriptプロジェクトに適しています。

参考リソース

← 一覧に戻る
PR
PR
PR
PR