前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nest.js 实战 (二):如何使用 Prisma 和连接 PostgreSQL 数据库

Nest.js 实战 (二):如何使用 Prisma 和连接 PostgreSQL 数据库

原创
作者头像
白雾茫茫丶
发布2024-07-16 09:38:09
1400
发布2024-07-16 09:38:09
举报
文章被收录于专栏:Nest.js 实战系列

什么是 Prisma?

Prisma 是一个开源的下一代 ORM。它包含了以下部分:

Prisma 客户端可以被用在 任何 Node.js(支持的版本)或 TypeScript 后端应用中(包括 Serverless 应用和微服务)。可以是一个 REST API,一个 GraphQL API,一个 gRPC API,或任何其他需要数据库的东西。

安装 Prisma

1、 安装 Prisma CLI 和依赖包

代码语言:bash
复制
 pnpm add @prisma/client
 pnpm add prisma -D

2、 初始化 Prisma

代码语言:ts
复制
 npx prisma init

此命令将生成一个基础的 prisma 文件夹和 schema.prisma 文件,文件目录结构如下:

代码语言:txt
复制
 nest-project
 ├── prisma
 │   ├── schema.prisma // 指定数据库连接并包含数据库 schema
 └── src

连接数据库

1、 在 schema.prisma 文件中配置数据库:

代码语言:ts
复制
 generator client {
   provider = "prisma-client-js"
 }

 datasource db {
   provider = "postgresql" // 这里使用 postgreSQL
   url      = env("DATABASE_URL")
 }

2、 .env 文件中配置数据库连接:

代码语言:txt
复制
 DATABASE_URL="postgresql://postgres:123456@localhost:5432/vue3-admin?schema=public"

定义 Prisma 模型

假设现在我们需要开发一个组织管理模块,而且组织是树形层级结构。

1、 在 schema.prisma 文件中定义 Organization 模型

代码语言:txt
复制
 model Organization {
   id        String     @id @default(uuid()) // 主键
   name      String     @unique // 组织名称
   code      String     @unique // 组织编码
   parentId    String?  
   parent      Organization? @relation(name: "OrgHierarchy", fields: [parentId], references: [id])
   children Organization[] @relation(name: "OrgHierarchy")
   sort       Int // 排序
   description String? // 组织描述
   icon       String? // 组织图标
   createdAt DateTime @default(now()) // 创建时间
   updatedAt DateTime @updatedAt // 更新时间
 }

2、 迁移数据库,将上述模型同步到数据库中:

代码语言:bash
复制
 npx prisma migrate dev --name init

此命令会生成 prisma/migrations 目录,文件目录结构如下:

代码语言:txt
复制
 nest-project
 ├── prisma
 │  ├── migrations
 │   └── 220240715074827_init
 │       └── migration.sql
 │   ├── schema.prisma // 指定数据库连接并包含数据库 schema
 └── src

3、 每次修改 schema.prisma 后,都需要重新生成 Prisma 客户端:

代码语言:bash
复制
 npx prisma generate

创建 Prisma 模块

1、 在 src/modules/prisma 目录中创建 prisma.service.ts 文件:

代码语言:ts
复制
  import { Injectable, OnModuleDestroy, OnModuleInit } from '@nestjs/common';
  import { PrismaClient } from '@prisma/client';

  @Injectable()
  export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy {
    constructor() {
      super();
    }
    async onModuleInit() {
      await this.$connect(); // 在模块初始化时连接到数据库
    }

    async onModuleDestroy() {
      await this.$disconnect(); // 在应用程序关闭时断开与数据库的连
    }
  }

2、 在 src/modules/prisma 目录中创建 prisma.module.ts 文件:

代码语言:ts
复制
  import { Module } from '@nestjs/common';

  import { PrismaService } from './prisma.service';

  @Module({
    providers: [PrismaService],
    exports: [PrismaService],
  })
  export class PrismaModule { }

使用 Prisma 客户端

1、 创建 organazation 模块,新建 organazation.service.ts 文件:

代码语言:ts
复制
 import { Injectable } from '@nestjs/common';

 import { PrismaService } from '@/modules/prisma/prisma.service';
 import { responseMessage } from '@/utils';

 @Injectable()
 export class OrganazationService {
   constructor(private prisma: PrismaService) { }

   /**
    * @description: 查询组织列表
    */
   async findAll() {
     const result = await this.prisma.organization.findMany();
     return responseMessage({
        records: result,
     });
   }
 }

2、 organazation.controller.ts 中使用 OrganazationService :

代码语言:ts
复制
 import { Controller, Get} from '@nestjs/common';
 import { OrganazationService } from './organazation.service';

 @Controller('organazation')
 export class OrganazationController {
  constructor(private readonly organazationService: OrganazationService) { }
  /**
   @description: 查询组织列表
   */
  @Get()
  findAll() {
    return this.organazationService.findAll();
  }
 }

3、 organazation.module.ts 文件:

代码语言:ts
复制
  import { Module } from '@nestjs/common';

  import { PrismaModule } from '@/modules/prisma/prisma.module';

  import { OrganazationController } from './organazation.controller';
  import { OrganazationService } from './organazation.service';

  @Module({
    imports: [PrismaModule],
    controllers: [OrganazationController],
    providers: [OrganazationService],
    exports: [OrganazationService],
  })
  export class OrganazationModule { }

4、 src/app.module.ts 中注册:

代码语言:ts
复制
  import { Module } from '@nestjs/common';

  import { OrganazationModule } from '@/modules/administrative/organazation/organazation.module';

  @Module({
    imports: [OrganazationModule],
  })
  export class AppModule { }

5、 如果 PrismaModule 需要全局注册,修改 prisma.module.ts,并在 AppModule 中导入 :

代码语言:ts
复制
  import { Global, Module } from '@nestjs/common';

  import { PrismaService } from './prisma.service';
 
  @Global() // 添加这个装饰器表明这个模块的提供商应该是全局的
  @Module({
    providers: [PrismaService],
    exports: [PrismaService],
  })
  export class PrismaModule { }

最终效果

总结

说一下我的使用感受,相比之前用的 Sequelize,感觉在 Nest.js 中使用 Prisma 更加便捷高效,没有繁琐的配置。

Github 仓库Vue3-Admin

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是 Prisma?
  • 安装 Prisma
  • 连接数据库
  • 定义 Prisma 模型
  • 创建 Prisma 模块
  • 使用 Prisma 客户端
  • 最终效果
  • 总结
相关产品与服务
Serverless
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档