号称下一代Node.js,Typescript以及go的orm的prisma 浅谈如何在nest.js中使用

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: 号称下一代Node.js,Typescript以及go的orm的prisma 浅谈如何在nest.js中使用

什么是orm

ORM(对象关系映射)是一种技术或工具,用于在关系型数据库和面向对象编程语言之间建立映射关系。它允许开发人员使用面向对象的方式来操作数据库,而无需直接编写复杂的 SQL 查询。


ORM 的主要目标是减少开发人员在数据库操作和对象操作之间的转换工作,提高开发效率并降低出错的可能性。它通过将数据库表映射为对象的类,将表中的行映射为对象的实例,以及将表中的列映射为对象的属性,使得开发人员可以使用常见的面向对象的概念(例如继承、关联等)来处理数据。


ORM 框架通常提供以下功能:


对象关系映射:将数据库表和行映射为对象和对象属性。

查询语言:提供一种高级的查询语言,使开发人员能够以面向对象的方式执行数据库查询,而不是直接编写 SQL 查询。

数据库操作:封装数据库的增删改查操作,提供简洁的接口来操作数据。

缓存管理:提供缓存机制以提高性能,并减少对数据库的访问。

数据关联和关系管理:支持定义和管理对象之间的关联关系,例如一对一、一对多、多对多等关系。

事务管理:提供事务支持,确保数据库操作的原子性和一致性。

一些常见的 ORM 框架包括:Hibernate(Java)、Entity Framework(.NET)、Django ORM(Python)、Sequelize(Node.js)等。这些框架提供了强大的功能和工具,简化了与数据库的交互,使开发人员能够更专注于业务逻辑而不是底层的数据库操作。


使用 ORM 可以提高开发效率、减少代码量,并且更易于维护和重构。然而,ORM 也有一些局限性,例如性能损耗、复杂查询的限制等。因此,在选择使用 ORM 还是直接编写 SQL 查询时,需要根据具体的项目需求和性能要求进行权衡和选择。


为什么选择prisma

Prisma 的主要目标是提高应用程序开发人员在使用数据库时的工作效率。以下是Prisma如何实现这一目标的几个例子:


在对象中思考而不是映射关系数据

查询而不是类以避免复杂的模型对象

数据库和应用程序模型的单一事实来源

防止常见陷阱和反模式的健康约束

使正确的事情变得容易的抽象(“成功坑”)

可在编译时验证的类型安全数据库查询

减少样板,因此开发人员可以专注于其应用的重要部分

在代码编辑器中自动完成,无需查找文档

综合来说,Orm让开发者更关心对象的思考,减少对sql的依赖


Prisma 的主要目标是提高应用程序开发人员在使用数据库时的工作效率。再次考虑生产力和控制之间的权衡,这就是Prisma的适应方式:


image.png


在nest.js项目中构建prisma

项目所需依赖包如下:


pnpm add prisma-binding ts-node @prisma/client 
pnpm add -D prisma typescript @types/node

vscode扩展记得要下载prisma插件,这样回有代码高亮以及提示


image.png


安装完成后,就可以开始我们的项目了


image.png


在命令行输入pnpm prisma 之后可以看到prisma的命令,本篇博客只介绍几种常用的的命令


首先用pnpm prisma init初始化我们的项目,完成后,可以看到出现了一个.env文件,它是配置数据连接的地方


image.png


我这里就以mysql为例,这是我的mysql连接的账户信息 我们在用prisma时,它可以自动帮我们创建好表的,最后的那一块定义自己想要的表名就行


image.png


image.png


接下来写第一张表


image.png


prisma对mysql的数据格式的封装


image.png


@default(autoincrement)是定义id让它自增长 在定义id时必须加上@id 不然会出错 , @db.xxx


后面都是mysql数据库的一些方法,比如你不想要String 想要255的,就可以


username String @db.VarChar(255)

在写完一张表的结构后 需要pnpm prisma migrate dev生成迁移文件


image.png


每次跑会让我们定义一个名字,自定义就行,也可以不给,直接回车即可


可以看到迁移文件生成的文件目录,这里类似于日志记录着每一次我们数据库的改动


image.png


接着打开数据库可视化工具看看


image.png


接下来我们要来对其进行一些crud的操作吧


首先创建一个prisma服务模块,我们引入查询构造器,让服务继承这个类

image.png

接着在controller中使用服务 创建一个基本的crud模板,请求都是异步的,所以需要用上async await


import { Controller, Get, Post, Body, Patch, Param, Delete, UsePipes, ParseIntPipe } from '@nestjs/common';
import { PrismaService } from './prisma.service';
@Controller('prisma')
export class PrismaController {
    constructor(private readonly prisma: PrismaService) { }
    @Get()
    async getUser() {
        return await this.prisma.user.findMany()
    }
    @Post()
    async createUser(@Body() dto: { username: string, age: number }) {
        return await this.prisma.user.create({
            data: {
                username: dto.username,
                age: +dto.age
            }
        })
    }
    @Patch(':id')
    async updateUser(@Param('id') id: number, @Body() dto: { username: string, age: number }) {
        return await this.prisma.user.update({
            where: {
                id: +id
            },
            data: {
                username: dto.username,
                age: +dto.age
            }
        })
    }
    @Delete(':id')
    @UsePipes(ParseIntPipe)
    async deleteUser(@Param('id') id: number) {
        return await this.prisma.user.delete({
            where: {
                id: id
            }
        })
    }
}


prisma非常的语义化 查询全部就是findMany()里面也可以跟where加限定添加 分页等


创建create 删除delete 更新update 大家可以自己尝试一下


写在最后

关于prisma还要挺多知识的,orm我也用过typeOrm 对比一下 prisma确实更为方便,无论哪一个都是为了提高我们开发效率,简化了操作,但是对于原生sql来说我们也要好好学习,因为很多api都是sql里面的,这样开发起来我们知道了sql的操作,就知道prima的操作了,不用多记这些api,希望能帮助到大家吧,后续还会更新关于prisma在nest.js中的一些注意点的

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
JavaScript 前端开发 Java
通义灵码 Rules 库合集来了,覆盖Java、TypeScript、Python、Go、JavaScript 等
通义灵码新上的外挂 Project Rules 获得了开发者的一致好评:最小成本适配我的开发风格、相当把团队经验沉淀下来,是个很好功能……
1957 103
|
Rust JavaScript 前端开发
Node.js 添加对 TypeScript 的实验性支持
Node.js 添加对 TypeScript 的实验性支持
362 53
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
475 4
|
数据采集 JavaScript 前端开发
使用Go和JavaScript爬取股吧动态信息的完整指南
本文介绍了如何使用Go和JavaScript构建网络爬虫,从股吧网站抓取实时股市信息。通过设置代理服务器以应对反爬策略,利用`got`库执行JavaScript提取动态数据,如用户讨论和市场分析。示例代码展示了爬虫的实现过程,包括浏览器实例创建、代理配置、JavaScript执行及数据打印。此方法有助于投资者及时获取市场资讯,为决策提供支持。
864 4
使用Go和JavaScript爬取股吧动态信息的完整指南
|
JavaScript 前端开发 安全
Node.js和Go有何优势?
【8月更文挑战第4天】Node.js和Go有何优势?
375 3
|
Web App开发 JavaScript 前端开发
Node.js与Go语言的对比?
【8月更文挑战第4天】Node.js与Go语言的对比?
1620 3
|
编解码 JavaScript 前端开发
【专栏】介绍了字符串Base64编解码的基本原理和在Java、Python、C++、JavaScript及Go等编程语言中的实现示例
【4月更文挑战第29天】本文介绍了字符串Base64编解码的基本原理和在Java、Python、C++、JavaScript及Go等编程语言中的实现示例。Base64编码将24位二进制数据转换为32位可打印字符,用“=”作填充。文中展示了各语言的编码解码代码,帮助开发者理解并应用于实际项目。
722 1
|
JavaScript Java 数据库连接
node,npm汇总,pip汇总,typeScript的使用,mybatis,sass的使用中文官网地址:
node,npm汇总,pip汇总,typeScript的使用,mybatis,sass的使用中文官网地址:
|
JavaScript Shell 开发者
怎样使用Nest.js快速构建高效Node.js应用?
这篇博客介绍了Nest.js,一个基于TypeScript的Node.js框架,适用于构建可维护和可扩展的服务器端应用。文章引导读者快速入门,包括安装Node.js和Nest.js CLI,创建新项目,安装依赖以及启动开发服务器。通过访问`http://localhost:3000`,可以看到"Hello World!",证明应用已成功运行。Nest.js因其模块化架构和强大的功能,成为现代Web开发的热门选择。
297 0