Skip to content

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,
    };
  }
}