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://www.mzph.cn/pingmian/46948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA23种设计模式简介

设计模式 设计模式的类型 创建型模式 隐藏了创建对象的过程,通过逻辑方法进行创建对象,而不是通过new关键字创建对象。 工厂方法模式 定义接口或一个抽象的工厂类,让它实现类(工厂)来决定创建哪一个实例对象。根据每…

Unity3D中ProtoBuf的编译与使用详解

引言 Unity3D作为当今最流行的游戏开发引擎之一,支持多种编程语言,特别是C#,并提供了丰富的工具集来创建高质量的2D和3D游戏。在游戏开发中,数据的序列化和反序列化是至关重要的一环,它们影响着游戏的性能、网络通信的…

idea 运行异常 gradle 项目

运行异常日志如: > Process command C:/Program Files/Java/jdk-1.8/bin/java.exe finished with non-zero exit value 1* Try: Run with --info or --debug option to get more log output. Run with --scan to get full insights.* Exception is: org.gradle.…

React、Vue的password输入框组件,如何关闭自动填充?

有时候我们的表单使用了一个password组件,这时候每次打开新建,都会自动获取浏览器缓存的密码,但是它的上一个input输入框并不是用户名,这时候我们希望我们的表单,每次点开的时候密码是空的,让用户自动输入&…

Llama - 量化

本文翻译整理自: https://llama.meta.com/docs/how-to-guides/quantization/ 文章目录 PyTorch中支持的量化模式使用 TorchAO 进行 Pytorch量化HF支持的量化QuantoAQLMAWQAutoGPTQBitsAndBytes 量化是机器学习中使用的一种技术,用于减少模型的计算和内存…

PyTorch张量数值计算

文章目录 1、张量基本运算2、阿达玛积3、点积运算4、指定运算设备⭐5、解决在GPU运行PyTorch的问题 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法&am…

【设计模式】【创建型模式】【02工厂模式】

系列文章 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录 系…

【安全】系统安全设计规范(DOC完整版)

1.1安全建设原则 1.2 安全管理体系 1.3 安全管理规范 1.4 数据安全保障措施 1.4.1 数据库安全保障 1.4.2 操作系统安全保障 1.4.3 病毒防治 1.5安全保障措施 1.5.1实名认证保障 1.5.2 接口安全保障 1.5.3 加密传输保障 1.5.4终端安全保障 软件资料清单列表部分文档&…

只需点击几下即可从Mac恢复已删除或丢失的文件

当无聊袭来时,您的 Mac 不是一个有趣的朋友吗?它确实是您“全天候”的主力军,可以兼顾日常工作。而且,它存储了大量关键文件,包括视频、图片、歌曲、文档等等。 如果丢失此数据会怎样?你的“数字生活”可能…

Vue学习---创建非默认选项项目vue2 vue3

vue create test-vue2 选择 Manually select features 选择初始化创建的组件 空格选中然后回车 vue-cli 在询问你,对于 Router 你是否以它的 history 模式使用它?默认值是 Yes 。 如果不使用 Router 的 history 模式,那自然就是 hash 模式。 …

CVE-2024-24549 Apache Tomcat - Denial of Service

https://lists.apache.org/thread/4c50rmomhbbsdgfjsgwlb51xdwfjdcvg Apache Tomcat输入验证错误漏洞,HTTP/2请求的输入验证不正确,会导致拒绝服务,可以借助该漏洞攻击服务器。 https://mvnrepository.com/artifact/org.apache.tomcat.embed/…

【Linux杂货铺】期末总结篇3:用户账户管理命令 | 组账户管理命令

🌈个人主页:聆风吟_ 🔥系列专栏:Linux杂货铺、Linux实践室 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 第五章5.1 ⛳️Linux 账户5.2 ⛳️用户配置文件和目录(未完待续)5.2.1 …

南京邮电大学统计学课程实验2 用EXCEL进行参数估计假设检验 指导

一、实验描述 实验目的 1、学会用Excel进行参数估计; 2、学会用Excel进行z检验-双样本平均差检验; 实验环境 实验中使用以下软件和硬件设备 (1)Windows XP操作系统; (2)PC机、EXCEL软件&…

Qt篇——在线程中更新ui控件

一般不建议直接在子线程更新ui控件,而是推荐使用信号触发到主线程更新ui。如果为了方便省事想简单地在子线程中更新ui控件,可以使用QMetaObject::invokeMethod函数。如下: //这是一个线程 void MainWidget::threadXXXX() {//updateLabelInTh…

面试题 29. 顺时针打印矩阵

顺时针打印矩阵 题目描述示例 题解 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 题解 从外往里一圈一圈遍历并…

python实现九九乘法表

1.self i 1 while i<9:j 1while j< i:print("j * i ",end)print(j * i ,end)print(" ",end)j 1i 1print() 实现结果&#xff1a; 2.改进 i 1 while i<9:j 1while j< i:# print("j * i ",end)# print(j * i ,end)# print(&…

基于centos2009搭建openstack-t版-ovs网络-脚本运行

openstackT版脚本 环境变量ip初始化 controlleriaas-pre.shiaas-install-mysql.shiaas-install-keystone.shiaas-install-glance.shiaas-install-placement.shiaas-install-nova-controller.shiaas-install-neutron-controller.shiaas-install-dashboard.sh computeiaas-instal…

誉天人工智能AI大模型火热报名中(HCIA-AI Solution Architect课程简介)

课程亮点 1.涵盖大模型prompt、RAG、LangChain、Fine-Turning、多模态、视觉生成等主流开源大模型技术 2.OpenAl开源大模型、昇腾大模型产品丝滑融合 3.从大模型产品开发到商业闭环到产品运营一站式打造大模型高级解决方案架构师 4.金牌讲师团队昇腾计算一线专家倾力交付 5.岗位…

2024嘶吼网络安全产业图谱(高清完整版)

在数字化和智能化浪潮的推动下&#xff0c;网络安全产业正处于一个快速变革的时期。从传统的防御手段和被动的威胁应对&#xff0c;到如今主动预防和智能检测技术的普及&#xff0c;网络安全领域的焦点和需求正不断演进。为了更好的理解当前网络安全产业现状和未来发展方向&…

PDF 转图片并插入到 EXCEL 再转PDF

pom.xml 引用 <dependency><groupId>com.aspose</groupId><artifactId>aspose-cells</artifactId><version>21.11</version></dependency><dependency><groupId>com.aspose</groupId><artifactId>as…