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

news2024/12/24 2:08:14

什么是 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" // 这里使用 postgreSQL
  url      = 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.coloradmin.cn/o/1937656.html

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

相关文章

Java面试(持续更新)

Redis使用场景 缓存穿透 当有该数据的时候,redis中的数据已经是原来数据的null值了,可能会出现不一致的问题。 缓存击穿 跟钱相关的强一致用互斥锁。 用户高体验用逻辑过期。 缓存雪崩 ttl随机值 mysql于redis保持数据同步 Redis持久化问题 RDB AOF R…

复习知识点java

目录 1.题目分析:2.思考题3.题目:4.题目:求X的反码和补码计算反码计算补码 计算2乘以8的结果实现两个整数变量的交换异或运算符(^)的特点 1.题目 byte b13,b24,b; bb1b2; b34; 哪句是编译失败的呢?为什么呢…

【人工智能】机器学习 -- 决策树(乳腺肿瘤数)

目录 一、使用Python开发工具,运行对iris数据进行分类的例子程序dtree.py,熟悉sklearn机器实习开源库。 二、登录https://archive-beta.ics.uci.edu/ 三、使用sklearn机器学习开源库,使用决策树对breast-cancer-wisconsin.data进行分类。 …

系统架构师考点--统一建模语言UML

大家好。今天我来总结一下面向对象的第二个考点–统一建模语言UML。 UML(统一建模语言)是一种可视化的建模语言,而非程序设计语言,支持从需求分析开始的软件开发的全过程。UML的结构包括构造块、规则和公共机制三个部分。其中考点主要集中在构造块部分&…

【深度学习入门篇 ⑩】Seq2Seq模型:语言翻译

【🍊易编橙:一个帮助编程小伙伴少走弯路的终身成长社群🍊】 大家好,我是小森( ﹡ˆoˆ﹡ ) ! 易编橙终身成长社群创始团队嘉宾,橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官…

前端Vue组件技术实践:构建自定义动态宫格菜单按钮组件

随着前端技术的不断发展,复杂度和开发难度也随之增加。传统的整体式开发方式已经难以满足现代前端应用的需求,特别是在业务场景复杂、产品迭代频繁的情况下。组件化开发作为一种有效的解决方案,通过拆分和组合独立的组件,实现了单…

C语言 | Leetcode C语言题解之第240题搜索二维矩阵II

题目&#xff1a; 题解&#xff1a; bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target){int i 0;int j matrixColSize[0] - 1;while(j > 0 && i < matrixSize){if(target < matrix[i][j])j--;else if(target > matrix[…

监测电商热品推荐的技术心得

在当今数字化时代&#xff0c;电商行业竞争激烈&#xff0c;准确监测热门商品推荐对于电商企业的运营和决策至关重要。通过不断的实践和探索&#xff0c;我积累了以下一些关于监测电商热品推荐的技术心得。 一、数据采集与整合 多平台数据抓取 要全面了解电商市场的热门商品&am…

ORBSLAM3 ORB_SLAM3 Ubuntu18.04 ROS Melodic 虚拟镜像 下载

build.sh 和 build_ros.sh编译结果截图&#xff1a; slam测试视频&#xff1a; orbslam3 ubuntu18.04 test 下载地址&#xff08;付费使用&#xff0c;不能接受请勿下载&#xff09;&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/13YeJS4RGa3fBrG8BKfPbBw?pwds6vg 提…

使用phpMyAdmin操作MYSQL(四)

一. 学会phpMyAdmin&#xff1f; phpMyAdminhttp://water.ve-techsz.cn/phpmyadmin/ 虽然我我们可以用命令行操作数据库&#xff0c;但这样难免没有那么直观&#xff0c;方便。所以接下来我们使用phpMyAdmin来操作MySQL&#xff0c;phpMyAdmin是众多MySQL图形化管理工具中使用…

​人人开源renren-security:基于SpringBoot、Vue3、ElementPlus等框架开发的权限管理系统

摘要&#xff1a; 随着信息技术的快速发展&#xff0c;企业的信息系统安全需求日益凸显。renren-security是一套基于SpringBoot、MyBatis-Plus、Shiro、Vue3、ElementPlus等框架开发的权限管理系统&#xff0c;它旨在为企业提供高效、安全、易用的权限管理解决方案。本文详细阐…

用Wireshark观察IPsec协议的通信过程

目录 一、配置本地安全策略 二、启动Wireshark&#xff0c;设置过滤器&#xff0c;开始捕获 1. 主模式 2. Quick mode 三、心得体会 1. 碰到的问题和解决办法 2. 心得 一、配置本地安全策略 配置好IPsec如下&#xff1a; 由于在windows server2008安装wireshark失败&…

Qt实现一个简单的视频播放器

目录 1 工程配置 1.1 创建新工程 1.2 ui界面配置 1.3 .pro配置 2 代码 2.1 main.c代码 2.2 widget.c 2.3 widget.h 本文主要记述了如何使用Qt编写一个简单的视频播放器&#xff0c;整个示例采用Qt自带组件就可以完成。可以实现视频的播放和暂停等功能。 1 工程配置 1.…

2024.7.19最新详细的VMware17.0.0安装

VM官网VMware - Delivering a Digital Foundation For Businesses。现在官网无法下载&#xff0c;点击会跳转到https://access.broadcom.com/default/ui/v1/signin/ 要注册一个账号&#xff1a; 注册登录以后&#xff0c;点击Please select your identity provider. - Support …

深度学习落地实战:大模型生成图片

前言 大家好&#xff0c;我是机长 本专栏将持续收集整理市场上深度学习的相关项目&#xff0c;旨在为准备从事深度学习工作或相关科研活动的伙伴&#xff0c;储备、提升更多的实际开发经验&#xff0c;每个项目实例都可作为实际开发项目写入简历&#xff0c;且都附带完整的代…

基于RFID的课堂签到系统设计

1.简介 基于RFID的课堂签到系统设计是一种利用无线射频识别&#xff08;RFID&#xff09;技术实现课堂自动签到的系统。这种系统通过RFID标签&#xff08;通常是学生携带的卡片或手环等&#xff09;与安装在教室内的RFID读写器之间的无线电信号进行数据交换&#xff0c;从而实现…

深度学习入门——与学习相关的技巧

前言 本章将介绍神经网络的学习中的一些重要观点&#xff0c;主题涉及寻找最优权重参数的最优化方法、权重参数的初始值、超参数的设定方法等 此外&#xff0c;为了应对过拟合&#xff0c;本章还将介绍权值衰减、Dropout等正则化方法&#xff0c;并进行实现。 最后将对近年来…

【深度学习】PyTorch框架(2):激活函数

1.引言 在文中&#xff0c;我们将深入探讨流行的激活函数&#xff0c;并分析它们在神经网络优化特性中的作用。激活函数在深度学习模型中扮演着至关重要的角色&#xff0c;因为它们为网络引入了非线性特性。尽管文献中描述了众多的激活函数&#xff0c;但它们并非一视同仁&…

如何优化 PostgreSQL 中的连接查询性能?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 如何优化 PostgreSQL 中的连接查询性能&#xff1f;一、理解连接查询的基本原理二、优化连接查询的关键…

JavaScript 模板字符串:让字符串拼接变得更优雅

在 JavaScript 开发中&#xff0c;字符串拼接是一个常见的需求。从简单的用户界面文本生成到复杂的动态数据格式化&#xff0c;字符串操作无处不在。传统的字符串拼接方法虽然功能强大&#xff0c;但往往显得冗长且难以阅读。为了解决这一问题&#xff0c;ES6&#xff08;ECMAS…