概述
- 在 NestJS 的官方文档中,有两处对数据库进行了介绍
集成 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 即可看到新建数据