Cấu hình Prisma v7 Với Nest.js Mới nhất

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

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.prismaprisma.config.ts

  • Trong schema.prisma, dùng generator mới, nhớ cầu hình DB url ở file .env nhé.

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

Bài viết liên quan

Tấn Công Ứng Dụng Web: Mối Đe Dọa Hàng Đầu – Phần 2

viết lại nội dung này ” Phát hiện các cuộc tấn công Cross Site Scripting (XSS)

AI Chatbot 2025: Xu Hướng Tất Yếu Cho Doanh Nghiệp Dẫn Đầu

Giới thiệu AI chatbots đã trải qua một hành trình đáng kể, từ những công cụ t

Tấn Công Ứng Dụng Web: Mối Đe Dọa Hàng Đầu – Phần 1

Tấn công web là gì? Ứng dụng web là các ứng dụng cung cấp dịch vụ cho người

SEO Mũ Trắng, Mũ Đen, Mũ Xám: Hiểu Biết và Lựa Chọn Phù Hợp

SEO Mũ Trắng, Mũ Đen, Mũ Xám: Hiểu Biết và Lựa Chọn Phù Hợp Trong kỷ nguyên s

Để lại một bình luận