0

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

Setup Prisma v7 trong Nest.js

image.png 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
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.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 {
  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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí