Drizzle ORM 完全攻略:TypeScript 類型安全的下一代資料庫操作
Drizzle ORM 是什麼?為什麼比 Prisma 更適合現代後端
如果你在 TypeScript 專案中用過 Prisma,你一定知道它的好處:自動生成類型、簡潔的 API、強大的 Migration 工具。但你也可能遇過它的問題:Client 尺寸太大(~2MB)、在 Serverless 環境切動慢、SQL 控制力不足。
Drizzle ORM 就是為了解決這些問題而生的。它採取了一個完全不同的理念:不是把 SQL 抽象掉,而是擁抱 SQL,把 SQL 語法直接映射到 TypeScript。每個查詢看起來就像 SQL,但有完整的類型推導、自動完成和編譯時驗證。
一些關鍵數字:
- 僅 7.4KB minified+gzipped
- 零依賴,Tree-shakeable
- 支援 PostgreSQL、MySQL、SQLite
- 完美支援 Serverless:Neon、Turso、D1、Vercel Postgres
Schema 定義:用 TypeScript 寫資料庫結構
Drizzle 用 TypeScript 來定義 Schema,不像 Prisma 有自己的 DSL:
import { pgTable, serial, text, timestamp, integer } from 'drizzle-orm/pg-core';
export const users = pgTable('users', {
id: serial('id').primaryKey(),
name: text('name').notNull(),
email: text('email').notNull().unique(),
age: integer('age'),
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),
});
這就是純粹的 TypeScript,你可以用所有 TypeScript 的功能來組織你的 Schema。
SQL-like 查詢語法
Drizzle 的查詢 API 看起來就像 SQL,但有完整的類型安全:
// SELECT
const allUsers = await db.select().from(users);
// WHERE
const activeUsers = await db.select()
.from(users)
.where(eq(users.age, 25));
// JOIN
const userPosts = await db.select()
.from(users)
.leftJoin(posts, eq(users.id, posts.authorId));
// INSERT
await db.insert(users).values({
name: 'Alice',
email: '[email protected]',
age: 28,
});
// UPDATE
await db.update(users)
.set({ age: 29 })
.where(eq(users.name, 'Alice'));
// DELETE
await db.delete(users)
.where(eq(users.id, 1));
如果你熟悉 SQL,這些語法幾乎不需要學習。而且每個查詢的返回類型都是自動推導的——你在 IDE 裡會得到完整的自動完成和類型檢查。
Migration 與 drizzle-kit
# 生成 migration 檔案
npx drizzle-kit generate
# 執行 migration
npx drizzle-kit migrate
# 直接推送 schema 變更(開發環境)
npx drizzle-kit push
# 開啟 Drizzle Studio(資料庫 GUI)
npx drizzle-kit studio
Drizzle Studio 是一個內建的資料庫 GUI 工具,讓你直接在瀏覽器中瀏覽和編輯資料。這是 Prisma Studio 也有的功能,但 Drizzle 的版本更輕量。
Drizzle vs Prisma 完整比較
- 尺寸:Drizzle ~7.4KB vs Prisma ~2MB
- Schema 語言:Drizzle 用 TypeScript,Prisma 用自己的 DSL
- SQL 控制力:Drizzle 更高,查詢看起來就像 SQL
- Serverless:Drizzle 因為尺寸小,在邊緣運算環境表現更好
- 學習曲線:Prisma 更容易上手,Drizzle 需要熟悉 SQL
如果你的專案需要部署到 Edge 環境(像是 Hono.js 邊緣運算框架),Drizzle 是更好的選擇。
Serverless 環境設定
Drizzle 與各大 Serverless 資料庫的整合都很簡單:
// Neon (PostgreSQL)
import { neon } from '@neondatabase/serverless';
import { drizzle } from 'drizzle-orm/neon-http';
const sql = neon(process.env.DATABASE_URL!);
const db = drizzle(sql);
// Turso (SQLite)
import { createClient } from '@libsql/client';
import { drizzle } from 'drizzle-orm/libsql';
const client = createClient({ url: process.env.TURSO_URL! });
const db = drizzle(client);
這對於使用 PostgreSQL 的專案來說特別方便。
漸進式採用
Drizzle 支援漸進式採用。你不需要一次過渡整個專案:
- 先為最關鍵的表定義 Schema
- 新功能用 Drizzle,舊程式碼保持不變
- 類型安全的好處立刻生效
如果你對後端框架的選擇有興趣,也可以看看 Rust Actix Web API 的教學。
總結:Drizzle 是現代 TypeScript 後端的最佳選擇
Drizzle ORM 用極小的尺寸和零依賴提供了完整的類型安全資料庫操作體驗。如果你熟悉 SQL、需要 Serverless 支援、或者對效能有要求,Drizzle 是 2026 年的最佳選擇。
繼續閱讀
PostgreSQL 17 JSON_TABLE 與 MERGE 效能實戰指南:SQL/JSON 新時代
深入解析 PostgreSQL 17 的 JSON_TABLE 與 MERGE RETURNING 新功能,用實際案例示範如何大幅簡化 JSON 資料處理與 upsert 工作流
相關文章
你可能也喜歡
探索其他領域的精選好文