概述
- 在 NestJS 的官方文档中,有两处对数据库进行了介绍
- 第一处位于左侧“Techniques(技术)”部分下的“数据库”板块,中文文档里同样有这个位置。
- Database
- 第二处是下面的“Recipes (秘籍)”板块,这里有多个部分都与数据库相关
- 例如 TypeORM、Mongoose、Prisma 等
- 在英文文档中,也能看到相关内容,不过官方文档仍有很多部分未翻译
- 如果小伙伴们有时间,也可以参与到这些开源项目的贡献中
- 第一处位于左侧“Techniques(技术)”部分下的“数据库”板块,中文文档里同样有这个位置。
集成 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: mysqlcommand: --default-authentication-plugin=mysql_native_passwordrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: exampleports:- 3306:3306adminer:image: adminerrestart: alwaysports:- 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 @uniquepassword 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 即可看到新建数据