· typescript / orm / drizzle
Drizzle ORM năm 2026 — đánh giá từ thực tế production
Drizzle đã sẵn sàng cho production trên edge và serverless Postgres. Bundle nhỏ hơn Prisma ~81×, throughput gấp 4×. Điểm đau thật sự nằm ở tooling cho team.
Bởi Ethan · Cập nhật 27 tháng 5, 2026
2.060 từ · 11 phút đọc
Drizzle đã sẵn sàng cho production năm 2026 và là lựa chọn đúng cho các workload edge hoặc serverless Postgres. Nếu bạn đang dùng Prisma và chưa gặp vấn đề về bundle size hay cold-start, chưa cần vội chuyển. Nhưng nếu bạn đang khởi động một project TypeScript mới sẽ chạy trên Neon, Supabase, Cloudflare Workers, hoặc bất kỳ serverless runtime nào mà startup time tốn tiền của bạn — Drizzle là điểm xuất phát.
Bài viết này dành cho ai
Developer TypeScript đang cân nhắc Drizzle cho project mới trong 2026, hoặc đang nghĩ đến việc chuyển từ Prisma. Nếu bạn đã dùng Drizzle được vài tháng và query đang chạy ổn, hãy đi thẳng đến phần “Chúng tôi đã thử gì” để xem phiên bản nào nên pin.
Chúng tôi đã thử gì
| Drizzle | Prisma | Kysely | |
|---|---|---|---|
| Phiên bản | 1.0.0-rc.3 (2026-05-18) · stable: 0.45.2 | 7.x (stable) | 0.28.x |
| Bundle (gzipped) | ~7.4 KB | ~600 KB | ~12 KB |
| Bundle (unminified) | ~31 KB | ~1.6 MB | ~48 KB |
| Engine | TypeScript, zero binary | TypeScript (Rust bỏ từ v7) | TypeScript, zero binary |
| Query builder | SQL-first + relational API | Schema-first + Prisma Client | SQL-first |
| Hỗ trợ DB | Postgres, MySQL, SQLite, CockroachDB | Postgres, MySQL, SQLite, SQL Server, MongoDB | Postgres, MySQL, SQLite |
| pgvector | First-class | Extension plugin, hạn chế | Raw SQL thủ công |
Benchmark (JIT mapper, Node 24.6, Postgres trên localhost): Drizzle 1.0.0-rc.1 đạt 9.4k RPS / p95 100ms so với Prisma ở 2.3k RPS / p95 150–200ms. Nguồn: tweet benchmark của DrizzleORM. Chúng tôi không tự chạy benchmark riêng — điều đó được ghi chú trong phần lưu ý. Prisma cũng có benchmark riêng dưới điều kiện workload khác; cả hai đều được dẫn link trong tài liệu tham khảo.
Điểm mạnh của Drizzle
Type inference không cần nghi lễ
Schema trong Drizzle là TypeScript thuần, không phải file .prisma riêng. Bạn định nghĩa bảng, các kiểu insert/select được suy ra tự động:
import { pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core';
export const posts = pgTable('posts', {
id: serial('id').primaryKey(),
title: text('title').notNull(),
body: text('body'),
createdAt: timestamp('created_at').defaultNow().notNull(),
});
// Các type này sinh ra từ schema — không cần bước codegen
type Post = typeof posts.$inferSelect;
type NewPost = typeof posts.$inferInsert;
So sánh với workflow của Prisma: định nghĩa schema bằng PSL, chạy prisma generate, lấy type từ generated client. Bước codegen không phải gánh nặng khi mọi thứ chạy ổn, nhưng nó thêm một build artifact vào repo và một bước vào CI pipeline. Drizzle không có cả hai.
Bundle size
Đây là lợi thế cấu trúc rõ nhất của Drizzle. Ở mức ~7.4 KB gzipped, drizzle-orm nhỏ hơn Prisma 7 (~600 KB) khoảng 80×. Dù Prisma đã bỏ binary Rust từ v7, runtime vẫn nặng đáng kể. Trên Cloudflare Workers hay bất kỳ platform nào tính tiền theo startup time mỗi request, chênh lệch kích thước đó là tiền thật.
JIT mapper và throughput
drizzle-orm v1.0.0-rc.1 đưa vào JIT mapper — object constructor được V8 compile tại thời điểm init schema thay vì được interpret lúc thực thi query. Kết quả: 9.4k RPS ở p95 100ms so với 2.3k RPS ở p95 150–200ms của Prisma trên cùng phần cứng và workload. Khoảng cách throughput gấp 4×. Dù bạn có nghi ngờ phương pháp benchmark, hướng kết quả hoàn toàn nhất quán với sự khác biệt kiến trúc.
Kiểm soát SQL-first
Drizzle lộ toàn bộ bề mặt SQL. Nếu bạn biết query mình muốn, cứ viết thẳng:
import { db } from './db';
import { posts, users } from './schema';
import { eq, desc, sql } from 'drizzle-orm';
const results = await db
.select({
title: posts.title,
author: users.name,
age: sql<number>`extract(epoch from now() - ${posts.createdAt}) / 86400`,
})
.from(posts)
.innerJoin(users, eq(posts.userId, users.id))
.orderBy(desc(posts.createdAt))
.limit(10);
Bạn không bị chặn bởi những gì ORM chọn để expose. Prisma có escape hatch ($queryRaw, $executeRaw), nhưng chúng phá vỡ type safety và cần deserialize thủ công.
RQBv2 relational API (ra mắt từ v0.40) cho bạn with() theo phong cách Prisma để eager load mà không N+1:
const postsWithComments = await db.query.posts.findMany({
with: {
comments: {
orderBy: (c, { desc }) => [desc(c.createdAt)],
limit: 5,
},
author: true,
},
where: (p, { eq }) => eq(p.published, true),
limit: 20,
});
Hỗ trợ pgvector first-class
Nếu bạn đang xây dựng tính năng tìm kiếm vector similarity, Drizzle xử lý pgvector mà không cần dùng đến raw SQL:
import { pgTable, serial, text } from 'drizzle-orm/pg-core';
import { vector } from 'drizzle-orm/pg-core';
import { cosineDistance, l2Distance } from 'drizzle-orm';
export const documents = pgTable('documents', {
id: serial('id').primaryKey(),
content: text('content').notNull(),
embedding: vector('embedding', { dimensions: 1536 }).notNull(),
});
// Similarity search — không cần raw SQL
const similar = await db
.select()
.from(documents)
.orderBy(cosineDistance(documents.embedding, queryEmbedding))
.limit(5);
Prisma có extension plugin cho pgvector nhưng tích hợp mỏng hơn — HNSW indexing và cosineDistance không phải first-class. Nếu pgvector là trung tâm của schema, Drizzle thắng ở điểm này.
Điểm cần chú ý
Conflict migration trong team
Đây là điểm đau thực tế lớn nhất của Drizzle. Không có cơ chế tự động giải quyết conflict migration (khác với Django migration framework). Khi hai developer tạo migration từ các thay đổi schema xung đột, một trong hai phải giải quyết thủ công, tạo lại và rebase. Workflow chính thức:
# Developer A đã merge trước; Developer B cần:
git pull origin main
# Xóa migration đã tạo của bạn
rm drizzle/0042_your_change.sql
# Tạo lại từ trạng thái đã merge
npx drizzle-kit generate
# Kiểm tra diff để xác nhận đúng
npx drizzle-kit migrate
Không nghiêm trọng, nhưng là chi phí workflow mà Prisma không có. Nếu team có nhiều developer thường xuyên thay đổi schema, hãy tính trước khoản thời gian này. Cộng đồng đã tài liệu hóa pattern chi tiết (GitHub discussion #1104), nhưng chưa có tooling tích hợp để tự động hóa.
Lưu ý rõ ràng: đừng dùng drizzle-kit push trên production. Lệnh này diff schema trực tiếp với database đang chạy và áp dụng thay đổi — không có migration file, không có audit trail. Dùng nó khi prototype trên database local, không hơn. drizzle-kit generate + drizzle-kit migrate mới là workflow production.
Cạm bẫy strict: true
Với strict: true trong drizzle-kit.config.ts, CLI từ chối chạy migration nếu không xác định được chắc chắn migration đó an toàn. Nghe hay đó. Vấn đề: nó chặn khi gặp bất kỳ thứ gì liên quan đến đổi tên column, vì Drizzle không phân biệt được bạn đổi tên column hay xóa một column rồi thêm column mới. Trên terminal local bạn nhận được interactive prompt, nhưng trên CI lệnh này có thể treo im hoặc fail tùy cách bạn cấu hình. Kiểm tra CI script trước khi bật strict: true.
CVE esbuild trong drizzle-kit
drizzle-kit bundle esbuild, và GHSA-67mh-4wv8-2f99 ảnh hưởng các phiên bản esbuild dưới 0.25.0 — lỗi CORS misconfiguration trong dev server đặt Access-Control-Allow-Origin: * trên mọi response, cho phép website độc hại đọc compiled source từ dev server local của nạn nhân qua JavaScript fetch. Bản vá có trong esbuild 0.25.0; nâng cấp drizzle-kit lên bất kỳ phiên bản nào bundle esbuild ≥0.25.0. CVE này chỉ ảnh hưởng kit (migration tooling), không ảnh hưởng drizzle-orm khi chạy runtime.
Thiếu hỗ trợ PostGIS polygon
Drizzle hỗ trợ Point của PostGIS natively. Polygon cần custom type:
import { customType } from 'drizzle-orm/pg-core';
const polygon = customType<{ data: string }>({
dataType() {
return 'geometry(Polygon, 4326)';
},
});
Không khó implement, nhưng chưa có sẵn. Nếu schema của bạn dùng nhiều geometry type của PostGIS, hãy tính trước overhead bảo trì cho các custom type này.
Lo ngại về sức khỏe project
Cuối 2025, cộng đồng đặt câu hỏi về mức độ hoạt động và minh bạch của team — ít commit hơn, roadmap cũ, ít tương tác trên issue. Team sau đó làm rõ họ đang cơ cấu lại kênh hỗ trợ và tiếp tục phát triển tích cực — v1.0.0-rc.3 ra mắt 2026-05-18 và nhịp release đang ổn định (GitHub issues #4391). Biết điều này là cần thiết. Nếu bạn đánh giá tuổi thọ của project, lịch sử release là tín hiệu đáng tin hơn là drama trên kênh hỗ trợ. Project đang được duy trì chủ động.
Bảng so sánh để chọn
| Tiêu chí | Chọn Drizzle | Chọn Prisma | Chọn Kysely |
|---|---|---|---|
| Runtime | Edge, serverless, Workers | Node.js, server chạy dài | Cả hai |
| Quen với SQL | Thoải mái viết SQL | Ưa schema-first DX | Ưa raw SQL, không muốn abstraction |
| Bundle budget | Chặt (Workers, Lambda) | Thoải mái | Chặt |
| pgvector | Cần, first-class | Hỗ trợ giới hạn là đủ | Raw SQL thủ công ổn |
| Database | Postgres, MySQL, SQLite | Postgres, MySQL, SQLite, MongoDB, SQL Server | Postgres, MySQL, SQLite |
| Nested write | Không cần | Cần (insert nhiều bảng phức tạp) | Không cần |
| SQL skill của team | Trung bình đến cao | Hỗn hợp | Cao |
| Migration UX | Chấp nhận giải quyết conflict thủ công | Muốn tooling merge tự động | Tự quản lý SQL ổn |
Kết luận
Dùng Drizzle nếu bạn deploy lên edge hoặc serverless runtime, nếu pgvector là trung tâm schema, hoặc nếu team bạn tư duy bằng SQL và không muốn lớp abstraction thừa. Bundle nhỏ hơn ~81×, throughput gấp 4×, và hỗ trợ vector first-class là những lợi thế thực sự, cộng hưởng mạnh trong các ngữ cảnh này.
Dùng Prisma nếu team có SQL skill không đồng đều, nếu cần MongoDB hoặc SQL Server, nếu bạn phụ thuộc vào nested write syntax của Prisma cho các mutation multi-table phức tạp, hoặc nếu giải quyết conflict migration trong team lớn sẽ là gánh nặng workflow thực sự. Prisma 7 đã thu hẹp đáng kể khoảng cách cold-start — nó không còn là lựa chọn rõ ràng thua kém trên serverless nữa, chỉ là option nặng hơn. Xem so sánh chi tiết Prisma vs Drizzle để biết thêm về lộ trình chuyển đổi.
Dùng Kysely nếu bạn muốn kiểm soát SQL đầy đủ mà không có bất kỳ lớp relational abstraction nào. Kysely là lựa chọn minh bạch cho team biết chính xác query mình muốn viết mỗi lần. Nó không có migration tooling riêng (bạn cần kết hợp với thứ gì đó như umzug), nhưng nếu đánh đổi đó chấp nhận được, kết quả là database layer trong suốt nhất có thể. Xem Drizzle vs Kysely để so sánh cú pháp query song song.
Lưu ý
Benchmark throughput (9.4k vs 2.3k RPS) đến từ benchmark của Drizzle công bố tháng 5/2026 trên Node 24.6. Chúng tôi đã đối chiếu mô tả setup nhưng không chạy test độc lập. Prisma có con số riêng dưới điều kiện workload khác. Hãy coi các con số tuyệt đối là tham khảo định hướng, không phải kết luận dứt khoát.
Lưu ý affiliate: bài viết này chứa affiliate link đến Neon và Supabase. Cả hai là Postgres provider phù hợp tự nhiên với Drizzle, và đều là công cụ chúng tôi đã dùng. Trạng thái affiliate không ảnh hưởng kết luận — nếu bất kỳ bên nào là lựa chọn yếu hơn, chúng tôi vẫn sẽ nói thẳng.
Chúng tôi chưa thử Drizzle với PlanetScale (MySQL), Turso (LibSQL/SQLite edge), hoặc CockroachDB trong bài review này. Drizzle hỗ trợ cả ba; Prisma hỗ trợ PlanetScale và CockroachDB nhưng không hỗ trợ Turso. Nếu deployment target của bạn là một trong số đó, hãy tự xác minh độ chín của adapter.
Tài liệu tham khảo
- drizzle-orm releases — GitHub
- Drizzle ORM latest releases — official docs
- JIT mapper benchmark — DrizzleORM tweet (2026-05-18)
- Drizzle benchmarks — official
- Migration conflict discussion — GitHub #1104
- Project health discussion — GitHub #4391
- Drizzle pgvector extension docs
- Drizzle vs Prisma community comparison — makerkit.dev
- GHSA-67mh-4wv8-2f99 — esbuild CORS misconfiguration CVE