Nestjs框架: 集成 Prisma

发布于:2025-07-07 ⋅ 阅读:(17) ⋅ 点赞:(0)

概述

  • 在 NestJS 的官方文档中,有两处对数据库进行了介绍
    • 第一处位于左侧“Techniques(技术)”部分下的“数据库”板块,中文文档里同样有这个位置。
    • 第二处是下面的“Recipes (秘籍)”板块,这里有多个部分都与数据库相关
      • 例如 TypeORMMongoosePrisma
      • 在英文文档中,也能看到相关内容,不过官方文档仍有很多部分未翻译
      • 如果小伙伴们有时间,也可以参与到这些开源项目的贡献中

集成 Prisma

下面,我们将依据官方文档,带领大家学习 Prisma 模块的集成方法

1 ) 创建 NestJS 项目

  • $ npm install -g @nestjs/cli
  • $ nest new hello-prisma

2 ) 设置 Prisma

  • $ cd hello-prisma
  • $ npm install prisma --save-dev
  • $ npx prisma 激活命令,可看到有一系列的 prisma 命令列表
    • prisma init
    • prisma generate
    • prisma studio
    • prisma migrate dev
    • prisma db pull
    • prisma db push
    • prisma validate
    • prisma format
    • prisma version
    • prisma debug
  • $ npx prisma init
    • 会创建 .env 的文件
    • 初始化(创建) prisma/schema.prisma
      generator client {
      	provider = "prisma-client-js"
      }
      
      datasource db {
      	provider = "postgresql"
      	url      = env("DATABASE_URL")
      }
      
    • 可安装 vscode 相应的 prisma 插件显示高亮
    • 在 .env 文件中, 出现 DATABASE_URL 的配置
      DATABASE_URL="mysql://root:example@localhost:3306/testdb"
      
    • 参考:mysql#connection-url

3 ) 启动 mysql

编写 docker-compose.mysql.yaml

services:
	db:
		image: mysql
		command: --default-authentication-plugin=mysql_native_password
		restart: always
		environment:
			MYSQL_ROOT_PASSWORD: example
		ports:
		 - 3306:3306

adminer:
	image: adminer
	restart: always
	ports:
	 - 8080:8080
  • $ docker compose -f docker-compose.mysql.yaml up -d

4 ) 编辑 prisma/schema.prisma

generator client {
	provider = "prisma-client-js"
}

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

model User {
	id          Int       @id       @default(autoincrement())
	username    String    @unique
	password    String

	@@map("user")
}

5 )创建一个初始化 的 migrate

$ npx prisma migrate dev --name init

prisma
├── dev.db
├── migrations
│   └── 20201207100915_init
│       └── migration.sql
└── schema.prisma
  • migrations 的作用是 做备份和迁移的过程会使用到的 sql 文件

6 ) 配置 prisma 相关服务

  • 安装 Prisma 客户端 $ npm install @prisma/client
  • 执行 $ npx prisma generate 针对上述 model 产生对应的 ts 类型

使用客户端

  • $ nest g mo database/prisma --no-spec
  • $ nest g s database/prisma --no-spec

prisma.module.ts

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

@Module({
	providers: [PrismaService],
	exports: [PrismaService],   // 要想跨模块使用,必须 exports 出来
})
export class PrismaModule {}

prisma.service.ts


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

@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {
  async onModuleInit() {
    await this.$connect();
  }
}
  • 在 app.module.ts 中,默认已经 import 了 PrismaModule

  • 相当于把 prisma.module.ts 中所有的 providers 中的 service

  • 全部注册了,就可以使用 PrismaService 的实例 来直接注入到 controller 里面

    import { Controller, Get, Version } from '@nestjs/common';
    import { PrismaService } from './database/prisma/prisma.service';
    
    @Controller()
    export class AppController {
    	constructor(private prismaService: PrismaService) {}
    
    	@Get()
    	// @Version('1')
    	async getHello(): Promise<any> {
    		const res = await this.prismaService.user.findMany({});
    		return res;
    	}
    }
    
  • 在 docker 服务中的 localhost:8080/#/login 登录数据库之后,创建 testdb

  • 这时候没有对应的表结构

  • 回到项目中,执行 $ npx prisma db push

  • 回到 adminer UI界面可以正常新建数据

  • 访问 localhost:3030/api/v1 即可看到新建数据