Drizzle ORMとは
Drizzle ORMは、TypeScriptファーストで設計された軽量なORMです。SQLに近い構文で直感的にクエリを書け、完全な型安全性を提供します。
特徴
✓ TypeScript ファースト
✓ SQLに近い構文
✓ ゼロ依存(軽量)
✓ Edge対応
✓ サーバーレス最適化
スキーマ定義
テーブル定義
// 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));
リレーショナルクエリ
// ネストしたデータを取得
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
# マイグレーション生成
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;
各種データベース対応
// 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との比較
| 観点 | Drizzle | Prisma |
|---|---|---|
| 構文 | SQLに近い | 独自DSL |
| バンドルサイズ | 小さい | 大きい |
| マイグレーション | コード生成 | Prisma Migrate |
| エッジ対応 | ネイティブ | Prisma Accelerate |
| 学習コスト | SQLを知っていれば低い | Prisma構文を学ぶ必要 |
まとめ
Drizzle ORMは、SQLに近い構文と完全な型安全性を両立した軽量なORMです。エッジ環境やサーバーレスに最適化されており、モダンなTypeScriptプロジェクトに適しています。
← 一覧に戻る