Setup Prisma v7 trong Nest.js
Bài viết dành cho ai mới học Nest.js và chọn prisma làm ORM và cấu hình theo chat và trên mạng vẫn gặp lỗi.
Lý do: Là vì Prisma v7 đã làm version mặc định khi bạn cài prisma. Nó mới cập nhật 2 ngày trước. Hôm nay là ngày (21/11/2025) và hiện có tới 2.4k ISSUE trên github.
Vì quá mới nên mình mất vài giờ để fix lỗi migrate mặc dù docs có hướng dẫn migrate ở các ứng dụng client nhưng với ứng dụng như Nest mình search bằng cả Gemini, ChatGPT 5.1 với websearch cũng không tìm ra cách config đúng 1 cách một lần ăn ngay. Và cuối cùng mình cũng viết cái bài này cho mọi người đỡ mất thời gian.
Bài viết này sẽ viết lại mọi file cần thiết cho cấu hình Prisma v7 trong Nestjs
Các thay đổi quan trọng trong Prisma v7
Bảng này chat gpt sinh ra nhé. Còn code là tôi code chay theo docs github.
| Thay Đổi | Mô Tả & Hướng Dẫn Cấu Hình |
|---|---|
| 🔧 Client mới không dùng Rust | Thay đổi provider trong schema.prisma để sử dụng client mới, nhanh hơn và nhẹ hơn.provider = "prisma-client" |
📁 Client được generate ra khỏi node_modules |
Khai báo thư mục đầu ra cho client trong schema.prisma. Điều này giúp các công cụ phát triển hoạt động đáng tin cậy hơn.output = "../src/generated/prisma" |
| 🛠️ Driver Adapters (Bắt buộc) | Prisma Client giờ đây cần một “Driver Adapter” để kết nối với cơ sở dữ liệu. Bạn phải cài đặt và cấu hình nó thủ công. |
⚙️ Tệp cấu hình prisma.config.ts |
Tạo tệp prisma.config.ts ở thư mục gốc dự án. Đây là nơi mới để định cấu hình các thông số như URL cơ sở dữ liệu, vị trí schema và script seed. |
| 🔒 Tải biến môi trường một cách tường minh | Prisma CLI không còn tự động tải biến môi trường. Bạn cần import dotenv một cách rõ ràng trong prisma.config.ts và các điểm vào ứng dụng (trừ khi dùng Bun).import 'dotenv/config' |
| 📦 Hỗ trợ ESM | Prisma giờ đây được xuất bản dưới dạng ES Module. Hãy đảm bảo package.json của bạn có "type": "module" và tsconfig.json được cấu hình phù hợp. |
Setup từ đầu
- Tạo new Nest.js app
pnpmadd @prisma/client@latest
pnpmadd -D prisma@latest
- Cài prisma client
pnpmadd @prisma/client
pnpmadd -D prisma
- Khởi tạo prisma
pnpm prisma init
Lệnh trên sẽ tạo 2 file mới là prisma/schema.prisma và prisma.config.ts
- Trong
schema.prisma, dùng generator mới, nhớ cầu hình DB url ở file.envnhé.
generator client {
provider ="prisma-client"
output ="../src/generated/prisma"
moduleFormat ="commonjs"}
datasource db {
provider ="postgresql"}enum UserRole {USERADMINSUPER_ADMIN}
model User {
id Int @id @default(autoincrement())
name String
email String @unique
password String
role UserRole @default(USER)
isActive Boolean @default(true)
isVerified Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt}
Dùng prisma-client thay vì prisma-client-js
prisma.config.ts
import"dotenv/config";import{ defineConfig, env }from"prisma/config";exportdefaultdefineConfig({
schema:"prisma/schema.prisma",
migrations:{
path:"prisma/migrations",},
datasource:{
url:env("DATABASE_URL"),},});
Cấu hình datasource/db_url ở file config riêng
- Prisma service và prisma module
import{ Module, Global }from'@nestjs/common';import{ PrismaService }from'./prisma.service';@Global()@Module({
providers:[PrismaService],
exports:[PrismaService],})exportclassPrismaModule{}
import{ Injectable, OnModuleInit, OnModuleDestroy }from'@nestjs/common';// Import từ đường dẫn mới, không phải '@prisma/client'import{ PrismaClient }from'./generated/prisma/client';import{ PrismaPg }from'@prisma/adapter-pg';// Adapter cho PostgreSQL@Injectable()exportclassPrismaServiceextendsPrismaClientimplementsOnModuleInit, OnModuleDestroy {constructor(){const adapter =newPrismaPg({
connectionString: process.env.DATABASE_URL||'postgresql://nhan:nhan@localhost:5432/db_demo_security',});console.log('Prisma adapter created');super({ adapter });// Truyền adapter vào Prisma Client}asynconModuleInit(){awaitthis.$connect();console.log('Prisma connected');}asynconModuleDestroy(){awaitthis.$disconnect();}}
- Cấu trúc thư mục
|-- prisma
| |-- migrations
| |-- schema.prisma
|-- prisma.config.ts
|-- src
| |-- app.controller.spec.ts
| |-- app.controller.ts
| |-- app.module.ts
| |-- app.service.ts
| |-- generated
| | `-- prisma # thư mục generated
| |-- main.ts
| |-- prisma
| |-- prisma.module.ts
| `-- prisma.service.ts
Sử dụng prisma
@Injectable()exportclassAppService{constructor(privatereadonly prisma: PrismaService){}asyncgetHello():Promise<string>{const users =awaitthis.prisma.user.findMany();return`Hello World! ${users.length}`;}}
Test
Endpoint này sẽ ra [] vì chưa có user nào trong db.
- Dùng trình duyệt
http://localhost:3000 - Hoặc dùng Httpie cli
http get :3000
Like cho mình đi các Bro
Nguồn: viblo.asia
