Nest.js 与 Prisma 结合
Prisma 篇
新建一个 Nest 项目
- 具体的参考前面章节
安装 Prisma
- 安装 Prisma CLI
bash
npm install -g prisma
初始化 Prisma
bash
npx prisma init
修改.env
文件
ts
DATABASE_URL='mysql://用户名:密码@地址:端口号/数据库名',
- 修改 prisma/schema.prisma 文件
ts
generator client {
provider = "prisma-client-js"
output = "../generated/prisma"
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
拉取数据库
bash
npx prisma db pull
创建 Prisma 实体
- 生成 Prisma 文件
bash
npx prisma generate
Nest.js 篇
创建一个 Module 和 Service
- 名字任意 我这里起名就是 prisma.module.ts 和 prisma.service.ts
prisma.module.ts
- 把这个模块设置成全局模块 这样省的每个单独的模块在引入
ts
import { PrismadbService } from "./prismadb.service";
import { Module, Global } from "@nestjs/common";
@Global() // Global decorator to make this module available globally
@Module({
imports: [],
controllers: [],
providers: [PrismadbService],
exports: [PrismadbService],
})
export class PrismadbModule {}
prisma.service.ts
我这里是使用了了
OnModuleInit
这个接口来在模块初始化的时候连接数据库这里我使用了
ConfigService
来获取.yml
文件中的数据库配置,要是用.env
自行修改即可
ts
import { Inject, Injectable, OnModuleInit } from "@nestjs/common";
import { PrismaClient } from "../../generated/prisma";
import { ConfigService } from "@nestjs/config";
@Injectable()
export class PrismadbService extends PrismaClient implements OnModuleInit {
constructor(private readonly configService: ConfigService) {
super({
log: ["info", "query"],
datasources: {
db: {
url: `mysql://${configService.get("db").mysql.username}:${
configService.get("db").mysql.password
}@${configService.get("db").mysql.host}:${
configService.get("db").mysql.port
}/${configService.get("db").mysql.database}`,
},
},
});
}
async onModuleInit() {
await this.$connect();
}
}
app.module.ts
- 直接挂载到 app.module.ts 中即可
ts
import { Module } from "@nestjs/common";
import { PrismadbModule } from "./prismadb/prismadb.module";
import configuration from "./config/index";
import { ConfigModule } from "@nestjs/config";
@Module({
imports: [
// 数据库模块
PrismadbModule,
// 配置模块
ConfigModule.forRoot({
cache: true,
load: [configuration],
isGlobal: true,
}),
],
controllers: [],
providers: [],
})
export class AppModule {}
使用
其他的模块 service 中需要使用数据库功能
Testdemo1Service 中使用数据库服务
ts
import { Inject, Injectable } from "@nestjs/common";
import { CreateTestdemo1Dto } from "./dto/create-testdemo1.dto";
import { UpdateTestdemo1Dto } from "./dto/update-testdemo1.dto";
// 注入
import { PrismadbService } from "../prismadb/prismadb.service";
// 注入全局的service 我这里就是举例查询emp表所有的数据
@Injectable()
export class Testdemo1Service {
@Inject(PrismadbService)
private readonly prismadbService: PrismadbService;
async findAll() {
const result = await this.prismadbService.emp.findMany();
return {
data: result,
};
}
}