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

简介: 这篇文章介绍了什么是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

相关文章
|
9月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
1016 7
|
人工智能 关系型数据库 OLAP
聚光灯已就位!阿里云瑶池数据库邀你征战Cursor首届实战征文大赛
阿里云AnalyticDB携手Cursor中文社区,正式发起首届实战征文大赛!我们诚邀开发者融合Cursor的智能编程能力与AnalyticDB PostgreSQL提供的Supabase服务进行项目开发,让优秀项目被专家看见、被机遇拥抱!
|
人工智能 自然语言处理 JavaScript
通义灵码2.5实战评测:Vue.js贪吃蛇游戏一键生成
通义灵码基于自然语言需求,快速生成完整Vue组件。例如,用Vue 2和JavaScript实现贪吃蛇游戏:包含键盘控制、得分系统、游戏结束判定与Canvas动态渲染。AI生成的代码符合规范,支持响应式数据与事件监听,还能进阶优化(如增加启停按钮、速度随分数提升)。传统需1小时的工作量,使用通义灵码仅10分钟完成,大幅提升开发效率。操作简单:安装插件、输入需求、运行项目即可实现功能。
655 4
 通义灵码2.5实战评测:Vue.js贪吃蛇游戏一键生成
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
关系型数据库 MySQL 数据库连接
Django数据库配置避坑指南:从初始化到生产环境的实战优化
本文介绍了Django数据库配置与初始化实战,涵盖MySQL等主流数据库的配置方法及常见问题处理。内容包括数据库连接设置、驱动安装、配置检查、数据表生成、初始数据导入导出,并提供真实项目部署场景的操作步骤与示例代码,适用于开发、测试及生产环境搭建。
583 1
|
SQL 数据建模 关系型数据库
别光知道存数据库了,数据建模才是王道!(入门指南+实战代码)
别光知道存数据库了,数据建模才是王道!(入门指南+实战代码)
2962 4
|
10月前
|
存储 数据库 开发者
Python SQLite模块:轻量级数据库的实战指南
本文深入讲解Python内置sqlite3模块的实战应用,涵盖数据库连接、CRUD操作、事务管理、性能优化及高级特性,结合完整案例,助你快速掌握SQLite在小型项目中的高效使用,是Python开发者必备的轻量级数据库指南。
821 0
|
10月前
|
JavaScript 前端开发 安全
【逆向】Python 调用 JS 代码实战:使用 pyexecjs 与 Node.js 无缝衔接
本文介绍了如何使用 Python 的轻量级库 `pyexecjs` 调用 JavaScript 代码,并结合 Node.js 实现完整的执行流程。内容涵盖环境搭建、基本使用、常见问题解决方案及爬虫逆向分析中的实战技巧,帮助开发者在 Python 中高效处理 JS 逻辑。
|
JavaScript 前端开发 算法
流量分发代码实战|学会用JS控制用户访问路径
流量分发工具(Traffic Distributor),又称跳转器或负载均衡器,可通过JavaScript按预设规则将用户随机引导至不同网站,适用于SEO优化、广告投放、A/B测试等场景。本文分享一段不到百行的JS代码,实现智能、隐蔽的流量控制,并附完整示例与算法解析。
384 1
|
存储 运维 监控
百万指标,秒级查询,零宕机——时序数据库 TDengine 在 AIOps 中的硬核实战
本篇文章详细讲述了七云团队在运维平台中如何利用 TDengine 解决海量时序数据存储与查询的实际业务需求。内容涵盖了从数据库选型、方案落地到业务挑战及解决办法的完整过程,特别是分享了升级 TDengine 3.x 时的实战经验,给到有需要的小伙伴参考阅读。
787 1

推荐镜像

更多