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 (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.
Setup từ đầu
- Tạo new Nest.js app
pnpm add @prisma/client@latest
pnpm add -D prisma@latest
- Cài prisma client
pnpm add @prisma/client
pnpm add -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 {
USER
ADMIN
SUPER_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";
export default defineConfig({
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],
})
export class PrismaModule {}
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()
export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy {
constructor() {
const adapter = new PrismaPg({
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
}
async onModuleInit() {
await this.$connect();
console.log('Prisma connected');
}
async onModuleDestroy() {
await this.$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()
export class AppService {
constructor(private readonly prisma: PrismaService) {}
async getHello(): Promise<string> {
const users = await this.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
All rights reserved