NestJS 集成 Prisma 数据库
1. 安装依赖
bash
pnpm install @prisma/client
pnpm install -D prisma2. 初始化 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 generate5. 在 NestJS 中使用 Prisma
5.1 创建 PrismaService 模块
目录结构建议:
sh
.
├─ src/
│ ├─ prisma/
│ │ ├─ prisma.module.ts
│ │ └─ prisma.service.ts
│ ├─ 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 init7. 使用 Prisma Studio
bash
npx prisma studio