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

什么是 Prisma?

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

  • Prisma Client: 自动生成、类型安全的查询构建器,用于 Node.jsTypeScript
  • Prisma Migrate: 数据迁移系统
  • Prisma Studio: 查询和编辑数据库中数据的图形化界面

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

安装 Prisma

  1. 安装 Prisma CLI 和依赖包
pnpm add @prisma/client
pnpm add prisma -D
  1. 初始化 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" // 这里使用 postgreSQLurl      = env("DATABASE_URL")
}
  1. .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 // 更新时间
}
  1. 迁移数据库,将上述模型同步到数据库中:
npx prisma migrate dev --name init

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

nest-project
├── prisma
│  ├── migrations
│   └── 220240715074827_init
│       └── migration.sql
│   ├── schema.prisma // 指定数据库连接并包含数据库 schema
└── src
  1. 每次修改 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(); // 在应用程序关闭时断开与数据库的连}}
  1. 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,});}
}
  1. 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();}
}
  1. 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 { }
  1. src/app.module.ts 中注册:
 import { Module } from '@nestjs/common';import { OrganazationModule } from '@/modules/administrative/organazation/organazation.module';@Module({imports: [OrganazationModule],})export class AppModule { }
  1. 如果 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 { }

最终效果

在这里插入图片描述

总结

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

Github 仓库:Vue3-Admin

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3250355.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

SQL知识点合集3

一、创建视图 create view 视图名 as select * from 表名 where 条件 二、触发器 触发器是与表有关的数据库对象,在 insert/update/delete 之前或之后触发并执行触发器中定义的 SQL语句, 有三种触发器类型。 1.insert触发器2.update触发器3.delete触…

WebRTC音视频-环境搭建

目录 期望效果 1:虚拟机和系统安装 2:WebRTC客户端环境搭建 2.1:VScode安装 2.2:MobaXterm安装 3:WebRTC服务器环境搭建 3.1:安装openssh服务器 3.2:安装Node.js 3.3:coturn穿透和转发服务器 3.3.1&a…

数据容易泄露,有什么软件可以加密吗

1. 金刚钻信息网站 特点:以其独特的透明加密技术和强大的权限管控功能著称,支持多种加密算法(如AES、RSA),提供详细的审计日志,记录所有加密文件的访问、修改和删除操作。适用于企业用户,可以有…

C++仓库管理系统

功能 代码在效果图后面 1.添加物品 2.删除物品 3.更新物品数量 4.查询物品 5.列出所有物品 6.保存并退出 注意事项:退出要输入“6”退出才能保存数据,不要直接按X关掉窗口(不会保存数据)。 效果图 源代码 编…

七款好用的CAD图纸加密软件推荐|2024最新排行榜

在2024年的今天,随着数字化转型的深化,企业对保护知识产权和商业机密的需求愈发迫切。特别是在依赖计算机辅助设计(CAD)的行业中,图纸加密软件成为了关键的工具,用于维护设计图纸的安全。以下是根据市场反馈…

<数据集>蛋壳裂缝检测数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:2520张 标注数量(xml文件个数):2520 标注数量(txt文件个数):2520 标注类别数:2 标注类别名称:[crack, egg] 序号类别名称图片数框数1crack245128352egg25142514 使…

RHCSA —— 第七节 (文件、 目录)

FHS FHS --- filesystem hirearchy standard 文件系统层级标准,定义了在类Unix系统中的目录结构和目录内容,即用户知道已安装的软件放在哪个目录下 Linux 目录结构的特点 1.使用树形目录结构来组织和管理结构 2.整个系统只有一个根目录(…

卸载linux 磁盘的内容,磁盘占满

Linux清理磁盘 https://www.cnblogs.com/siyunianhua/p/17981758 当前文件夹下,数量 ls -l | grep "^-" | wc -l ls -lR | grep "^-" | wc -l 找超过100M的大文件 find / -type f -size 100M -exec ls -lh {} \; df -Th /var/lib/docker 查找…

记录vivado自带IP iBert眼图近端回环

记录利用vivado自带IP核工具测试信号质量 ibert是测试眼图的工具,在使用的时候并不用改太多的内容,只需要注意参考时钟及所需要的引脚即可。由于条件的限制,并没有使用光纤和电缆进行连接进行外部回环,仅使用内部回环做测试&…

P4-AI产品经理-九五小庞

从0开始做AI产品的完整工作方法 项目启动 项目实施 样本测试模型推荐引擎 构建DMP(数据管理平台) 项目上线

用户体验优化的关键:掌握原型设计思路提升产品质量

原型设计是产品的缩影。在产品推出之前,原型设计承载着UI设计和交互测试的大部分工作,可以帮助产品经理和UX设计师以最低的成本测试产品的逻辑框架、交互体验、创造性表达等,这不仅节省了时间和成本,而且缩短了各部门之间的沟通成…

[PM]产品运营

生命周期 运营阶段 主要工作 拉新 新用户的定义 冷启动 拉新方式 促活 用户活跃的原因 量化活跃度 运营社区化/内容化 留存 用户流失 培养用户习惯 用户挽回 变现 变现方式 付费模式 广告模式 数据变现 变现指标 传播 营销 认识营销 电商营销中心 拼团活动 1.需求整理 2.…

独立游戏《星尘异变》UE5 C++程序开发日志5——实现物流系统

目录 一、进出口清单 二、路径计算 三、包裹 1.包裹的数据结构 2.包裹在场景中的运动 四、道路 1.道路的数据结构 2.道路的建造 3.道路的销毁 4.某个有道路连接的建筑被删除 作为一个工厂类模拟经营游戏,各个工厂之间的运输必不可少,本游戏采用的…

Apache SeaTunnel——OLAP 引擎的数据动脉

导读本文将分享如何利用 Apache SeaTunnel 将各个业务系统的数据同步到 OLAP 引擎。 主要内容包括以下六大部分: 1. Apache SeaTunnel 项目介绍 2. Apache SeaTunnel 核心功能 3.SeaTunnel 在 OLAP 场景下的应用 4. 社区近期计划 5. WhaleTunnel 产品特性 6. …

《Winodws API每日一练》11.3 工具栏控件

本节将讲述工具栏控件的创建和使用。 本节必须掌握的知识点: 工具栏控件 第72练:工具栏控件 11.3.1 工具栏控件 工具栏控件(Toolbar Control)是Windows操作系统提供的一种用户界面元素,用于显示常用的命令按钮、工具…

PostgreSQL创建表和自增序列

一、创建表: 注意: 1、在mysql没有序列的概念,id自增通过auto_increment实现; 2、pgsql没有auto_increment的概念,如何实现id自增?有两种方式: 方式一:创建序列,绑定…

MYSQL调优详解:案例解析(第40天)

系列文章目录 一、数据库设计优化 二、查询优化 三、架构优化 四、其他优化策略 五、优化案例解析 文章目录 系列文章目录前言一、数据库设计优化二、查询优化三、架构优化四、其他优化策略五、优化案例解析案例一:优化SELECT查询案例二:使用索引案例三…

springboot系列十: 自定义转换器,处理JSON,内容协商

文章目录 自定义转换器基本介绍应用实例查看源码注意事项和细节 处理JSON需求说明应用实例 内容协商基本介绍应用实例debug源码优先返回xml注意事项和细节 ⬅️ 上一篇: springboot系列九: 接收参数相关注解 🎉 欢迎来到 springboot系列十: 自定义转换器&#xff0c…

ELK日志收集

一、什么是ELK ELK 是由 Elasticsearch、Logstash、Kibana 三个开源软件的组成的一个组合体,ELK 是 elastic 公司研发的一套完整的日志收集、分析和展示的企业级解决方案。 ELK 的好处: ELK 组件在大数据运维系统中,主要可解决的问题如下&…

MDK5没有DeviceName

遇到的问题是Jlink驱动问题 不是引脚接反 使用国产GD单片机不同的工程,有的有Device Name,有的没有Device Name(下图是弄好的情况,有Device Name) 硬件链接,和设备都没有问题:无法仿真,无法下…