Skip to content

NestJS 集成 Prisma 数据库 ORM

1. 安装依赖

bash
pnpm install @prisma/client
pnpm install -D prisma

2. 初始化 Prisma

bash
npx prisma init

这将创建一个 prisma 文件夹,里面包含一个 schema.prisma 文件。

3. 配置数据源

prisma/schema.prisma 中配置数据源:

prisma
datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

.env 文件中添加数据库连接字符串:

env
DATABASE_URL="postgresql://user:password@localhost:5432/mydb"

4. 生成 Prisma Client

bash
npx prisma generate

5. 在 NestJS 中使用 Prisma

5.1 创建 PrismaService 模块

目录结构建议:

bash
src/
  prisma/
    prisma.module.ts  # Prisma 模块
    prisma.service.ts  # Prisma 服务
  app.module.ts
  main.ts

src/prisma/prisma.module.ts 中创建 Prisma 模块:

typescript
import { Global, Module } from '@nestjs/common';
import { PrismaService } from './prisma.service';

@Global() // 使用 @Global() 装饰器使 PrismaService 在整个应用中可用
@Module({
  providers: [PrismaService],
  exports: [PrismaService],
})
export class PrismaModule {}

src/prisma/prisma.service.ts 中创建 Prisma 服务:

typescript
import { Injectable, OnModuleInit } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';

@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {
  constructor() {
    super({
      // 配置 Prisma 日志
      log: ['error', 'warn', 'info', 'query'],
    });
  }

  async onModuleInit() {
    await this.$connect();
  }
}

5.2 在 AppModule 中注册 PrismaService

typescript
import { Module } from '@nestjs/common';
import { PrismaModule } from './prisma/prisma.module';

@Module({
  imports: [PrismaModule],
})
export class AppModule {}

5.3 在其他模块中注入 PrismaService

typescript
import { Controller, Get } from '@nestjs/common';
import { PrismaService } from './prisma.service';

@Controller('users')
export class UsersController {
  constructor(private readonly prisma: PrismaService) {}

  @Get()
  async findAll() {
    return this.prisma.user.findMany();
  }
}

6. 运行数据库迁移

bash
npx prisma migrate dev --name init

7. 使用 Prisma Studio

bash
npx prisma studio