Drizzle ORM: TypeScript ORM hiện đại cho PostgreSQL và MySQL

Drizzle ORM là một ORM hiện đại dành cho TypeScript, hỗ trợ PostgreSQL, MySQL, SQLite và các database serverless như Turso, Neon, Cloudflare D1. Với kích thước chỉ ~7.4KB gzipped, 0 dependency và 35.6k+ sao trên GitHub, Drizzle cung cấp trải nghiệm type-safe tương tự Prisma nhưng nhẹ hơn và tích hợp sâu với TypeScript hệ thống hơn.

Đôi với các nhà phát triển JavaScript/TypeScript, Drizzle ORM mở ra cách tiếp cận mới: thay vì dùng ORM “magic” phức tạp, Drizzle cung cấp một query builder type-safe với khả năng kiểm soát SQL hoàn toàn — vừng đủ an toàn kiểu, vừng linh hoạt như viết SQL thuần.

Screenshot Drizzle Studio đang chạy locally, hiển thị database browser UI với bảng Customers, Orders

Tại sao chọn Drizzle ORM?

So với các ORM truyền thống như Sequelize hay TypeORM, Drizzle có những ưu thế vượ trội:

  • TypeScript-first — Schema và query đều type-safe, IDE hỗ trợ autocompletion và error checking thời gian thực
  • Nhẹ và nhanh — 0 dependency, tree-shakeable, phù hợp với edge runtime
  • Full SQL control — Query builder cho phép viết raw SQL khi cần, không bị kén chất lượng bởi ORM abstraction
  • Serverless ready — Hoạt động trên mọi JS runtime: Node.js, Bun, Deno, Cloudflare Workers, Vercel Edge
  • Drizzle Studio — Database browser đẹp, local-first, không cần cài đặt database client truyền thống

Đặc biệt, Drizzle được thiết kế để hoạt động tốt với các framework hiện đại như Next.js App Router, điều mà nhiều nhà phát triển ở Việt Nam đang chuyển đổi.

Cài đặt và cấu hình

Cài đặt Drizzle ORM qua npm hoặc yarn:

npm install drizzle-orm
npm install -D drizzle-kit

Drizzle Kit là CLI tool dùng cho migrations và schema management. Cài đặt Drizzle Studio riêng lẻ nếu cần:

npx drizzle-kit studio

Định nghĩa schema với TypeScript

Schema trong Drizzle được định nghĩa trực tiếp bằng TypeScript — không cần DSL riêng:

import { pgTable, text, integer, serial, timestamp } 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(),
});

Schema này sinh ra câu lệnh SQL tương đương:

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  email TEXT NOT NULL UNIQUE,
  age INTEGER,
  created_at TIMESTAMP DEFAULT NOW()
);
Diagram sơ đồ cấu trúc Drizzle ORM table declaration - pgTable, column types, relationships

Mối quan hệ và truy vấn dữ liệu

Drizzle hỗ trợ định nghĩa quan hệ giữa các table một cách rõ ràng. Ví dụ một blog có posts và comments:

export const posts = pgTable("posts", {
  id: serial("id").primaryKey(),
  title: text("title").notNull(),
  authorId: integer("author_id").references(() => users.id),
});

export const comments = pgTable("comments", {
  id: serial("id").primaryKey(),
  content: text("content").notNull(),
  postId: integer("post_id").references(() => posts.id),
  authorId: integer("author_id").references(() => users.id),
});

// Relations
import { relations } from "drizzle-orm";

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

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

Với relations định nghĩa sẵn, bạn có thể thực hiện truy vấn nested data giống Prisma — tránh vấn đề N+1:

const result = await db.query.users.findMany({
  with: {
    posts: true,
    comments: true,
  },
});

Drizzle Kit: Quản lý migration

Drizzle Kit cung cấp workflow migration hiện đại:

# Tạo migration file từ schema thay đổi
npx drizzle-kit generate

# Chạy migration
npx drizzle-kit migrate

# Hoặc dùng push để sync schema trực tiếp lên DB (dev mode)
npx drizzle-kit push

Workflow này tương tự Flyway hoặc Alembic — file migration sinh ra SQL thực tế, bạn có thể review trước khi áp dụng. Drizzle Studio cho phép visualize database structure và chạy queries từ giao diện web.

So sánh với Prisma

Bảng so sánh nhanh giữa Drizzle ORM và Prisma:

td>Edge runtime
Tính năng Drizzle ORM Prisma
Kích thước ~7.4KB gzipped Lớn hơn (có runtime engine riêng)
Schema DSL TypeScript native Prisma Schema Language riêng
Hoạt động tốt Giới hạn (cần native engine)
Relations GraphQL-style API Built-in relation queries
License Apache 2.0 Prisma License (commercial)

Chi tiết tại orm.drizzle.team.

Sử dụng với Next.js

Drizzle tích hợp tốt với Next.js App Router, đặc biệt khi dùng Database serverless. Dưới đây là setup cơ bản trong route handler:

// lib/db.ts
import { drizzle } from "drizzle-orm/neon-http";
import { neon } from "@neondatabase/serverless";

const sql = neon(process.env.DATABASE_URL!);
export const db = drizzle(sql, { schema: { users, posts } });
// app/api/users/route.ts
import { db } from "@/lib/db";
import { users } from "@/db/schema";

export async function GET() {
  const allUsers = await db.select().from(users);
  return Response.json(allUsers);
}

Tích hợp validation

Drizzle cung cấp tích hợp với các thư viện validation như Zod, Valibot, TypeBox:

import { createSelectSchema } from "drizzle-zod";
import { z } from "zod";

const userSchema = createSelectSchema(users, {
  name: (schema) => schema.name.min(1),
});

Drizzle Studio family

Drizzle Studio cung cấp nhiều cách deploy:

  • Local — chạy ngay trong development
  • Gateway — self-hosted cho team
  • Chrome extension — truy cập từ browser
  • Studio Component — nhúng UI vào ứng dụng của bạn

Kết luận

Drizzle ORM đại diện cho xu hướng mới của TypeScript ecosystem: type-safe, lightweight, SQL-first. Với hỗ trợ đa dạng database, edge runtime và công cụ quản lý migration mạnh mẽ, Drizzle là lựa chọn tuyệt vời cho các dự án Next.js/TypeScript hiện đại — đặc biệt phù hợp với nhà phát triển Việt Nam đang chuyển đổi sang serverless và edge computing.

Kết hợp Drizzle Studio để quản lý database, Drizzle Kit cho migrations, và Drizzle ORM cho queries type-safe — workflow đầy đủ, professional chỉ với một thư viện nhỏ gọn.

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Git Worktree: Quản lý nhiều branch đồng thời trên cùng repo

Git Worktree là gì Bạn đang phát triển tính năng feature/A, rồi hotfix cấp bách từ branch main chen ngang. Thông thường bạn phải stash, checkout, sau đó quay lại…

Xem thêm

Zod: TypeScript Schema Validation library mạnh mẽ và type-safe

Zod: TypeScript Schema Validation library mạnh mẽ và type-safe Zod là library validation schema cho TypeScript giúp developer đảm bảo dữ liệu đầu vào chính xác đồng thời giữ nguyên…

Xem thêm

Rust Async: Tìm hiểu Future, Pin, và Waker trong async/await

Rust Async: Tìm hiểu Future, Pin, và Waker trong async/await Rust async/await là một trong những tính năng mạnh mẽ nhất của ngôn ngữ, cho phép viết code không đồng…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất