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

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 这篇文章介绍了什么是Prisma以及如何在Node.js和TypeScript后端应用中使用它。Prisma是一个开源的下一代ORM,包含PrismaClient、PrismaMigrate、PrismaStudio等部分。文章详细叙述了安装PrismaCLI和依赖包、初始化Prisma、连接数据库、定义Prisma模型、创建Prisma模块的过程,并对比了Prisma和Sequelize在Nest.js中的使用体验,认为Prisma更加便捷高效,没有繁琐的配置。

什么是 Prisma?

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

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

安装 Prisma

  1. 安装 Prisma CLI 和依赖包
    pnpm add @prisma/client
    pnpm add prisma -D
    
  2. 初始化 Prisma
    npx prisma init
    
    此命令将生成一个基础的 prisma 文件夹和 schema.prisma 文件,文件目录结构如下:
    nest-project
    ├── prisma
    │   ├── schema.prisma // 指定数据库连接并包含数据库 schema
    └── src
    

连接数据库

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

    generator client {
    provider = "prisma-client-js"
    }
    
    datasource db {
    provider = "postgresql" // 这里使用 postgreSQL
    url      = env("DATABASE_URL")
    }
    
  2. .env 文件中配置数据库连接:

    DATABASE_URL="postgresql://postgres:123456@localhost:5432/vue3-admin?schema=public"
    

定义 Prisma 模型

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

  1. schema.prisma 文件中定义 Organization 模型
    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. 迁移数据库,将上述模型同步到数据库中:
    npx prisma migrate dev --name init
    
    此命令会生成 prisma/migrations 目录,文件目录结构如下:
    nest-project
    ├── prisma
    │  ├── migrations
    │   └── 220240715074827_init
    │       └── migration.sql
    │   ├── schema.prisma // 指定数据库连接并包含数据库 schema
    └── src
    
  3. 每次修改 schema.prisma 后,都需要重新生成 Prisma 客户端:
    npx prisma generate
    

创建 Prisma 模块

  1. src/modules/prisma 目录中创建 prisma.service.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 文件:

    import {
         
          Module } from '@nestjs/common';
    
    import {
         
          PrismaService } from './prisma.service';
    
    @Module({
         
         
    providers: [PrismaService],
    exports: [PrismaService],
    })
    export class PrismaModule {
         
          }
    

使用 Prisma 客户端

  1. 创建 organazation 模块,新建 organazation.service.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 :

    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 文件:

    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 中注册:

    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 中导入 :

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

最终效果

cvkq7xv8ay9ujsczss3w135vl5ud83e0.png

总结

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

Github 仓库Vue3-Admin

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
24天前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL的数据库
PostgreSQL的逻辑存储结构涵盖数据库集群、数据库、表、索引、视图等对象,每个对象有唯一的oid标识。数据库集群包含多个数据库,每个数据库又包含多个模式,模式内含表、函数等。通过特定SQL命令可查看和管理这些数据库对象。
|
25天前
|
数据库 C# 开发者
ADO.NET连接到南大通用GBase 8s数据库
ADO.NET连接到南大通用GBase 8s数据库
|
24天前
|
数据库连接 Linux Shell
Linux下ODBC与 南大通用GBase 8s数据库的无缝连接配置指南
本文详细介绍在Linux系统下配置GBase 8s数据库ODBC的过程,涵盖环境变量设置、ODBC配置文件编辑及连接测试等步骤。首先配置数据库环境变量如GBASEDBTDIR、PATH等,接着修改odbcinst.ini和odbc.ini文件,指定驱动路径、数据库名称等信息,最后通过catalog.c工具或isql命令验证ODBC连接是否成功。
|
23天前
|
JSON JavaScript 关系型数据库
node.js连接GBase 8a 数据库 并进行查询代码示例
node.js连接GBase 8a 数据库 并进行查询代码示例
|
24天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
|
24天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(下)
本文接续前文,深入讲解了在Windows环境下使用C#和ADO.NET操作南大通用GBase 8s数据库的方法。通过Visual Studio 2022创建项目,添加GBase 8s的DLL引用,并提供了详细的C#代码示例,涵盖数据库连接、表的创建与修改、数据的增删查改等操作,旨在帮助开发者提高数据库管理效率。
|
13天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
87 15
|
6天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
13天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
17天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
下一篇
DataWorks