【GraphQL】什么是Prisma?

本页提供了Prisma及其工作原理的高级概述。

什么是Prisma?

Prisma是一个开源的下一代ORM。它由以下部分组成:

  • Prisma客户端:Node.js和TypeScript的自动生成和类型安全查询生成器
  • Prisma迁移:迁移系统
  • Prisma Studio:GUI,用于查看和编辑数据库中的数据。

Prisma Studio是Prisma ORM中唯一一个非开源的部分。您只能在本地运行Prisma Studio。Prisma Studio还集成在我们的商业产品Prisma Data Platform中,名称为Data Browser。在数据浏览器中,您可以查看和编辑每个项目的数据,其他团队成员也可以在您授予他们适当角色的权限后进行查看和编辑。

Prisma客户端可以用于任何Node.js(支持的版本)或TypeScript后端应用程序(包括无服务器应用程序和微服务)。这可以是REST API、GraphQL API、gRPC API或任何其他需要数据库的东西。

https://youtu.be/EEDGwLB55bI

How does Prisma work?

The Prisma schema

每个使用Prisma工具箱中工具的项目都以Prisma模式文件开始。Prisma模式允许开发人员用直观的数据建模语言定义他们的应用程序模型。它还包含到数据库的连接,并定义生成器:

关系数据库

MongoDB

datasource db {provider = "postgresql"url      = env("DATABASE_URL")
}generator client {provider = "prisma-client-js"
}model Post {id        Int     @id @default(autoincrement())title     Stringcontent   String?published Boolean @default(false)author    User?   @relation(fields: [authorId], references: [id])authorId  Int?
}model User {id    Int     @id @default(autoincrement())email String  @uniquename  String?posts Post[]
}

注意:Prisma模式具有强大的数据建模功能。例如,它允许您定义“Prisma-level”关系字段,这将使您更容易在Prisma Client API中使用关系。在上述情况下,User上的posts字段仅在“Prisma级别”上定义,这意味着它不会在底层数据库中显示为外键。

在这个模式中,您可以配置三件事:

  • 数据源:指定数据库连接(通过环境变量)
  • Generator:表示要生成Prisma客户端
  • 数据模型:定义应用程序模型

Prisma数据模型

在本页中,重点是数据模型。您可以在相应的文档页面上了解有关数据源和生成器的更多信息。

Prisma模型的功能

数据模型是模型的集合。模型有两个主要功能:

  • 表示关系数据库中的表或MongoDB中的集合
  • 为Prisma客户端API中的查询提供基础

获取数据模型

将数据模型“获取”到Prisma架构中有两个主要工作流程:

  • 使用Prisma Migrate手动写入数据模型并将其映射到数据库
  • 通过内省数据库生成数据模型

一旦定义了数据模型,您就可以生成Prisma客户端,它将公开CRUD和更多针对已定义模型的查询。如果您使用TypeScript,您将获得所有查询的完全类型安全性(即使只检索模型字段的子集)。

使用Prisma客户端访问数据库

生成Prisma客户端

使用Prisma客户端的第一步是安装@Prisma/Client npm包:

$npm install @prisma/client

安装@prisma/client包会调用prisma generate命令,该命令读取您的prisma模式并生成prisma client代码。默认情况下,代码会生成到node_modules/.prsma/client文件夹中。

更改数据模型后,您需要手动重新生成Prisma客户端,以确保node_modules/.prsma/Client内的代码得到更新:

$prisma generate

使用Prisma客户端向数据库发送查询

生成Prisma客户端后,您可以将其导入到代码中,并将查询发送到数据库。这就是设置代码的样子。

导入并实例化Prisma客户端

import

require

import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

现在,您可以开始通过生成的Prisma Client API发送查询,下面是一些示例查询。请注意,所有Prisma客户端查询都返回普通的旧JavaScript对象。

了解有关Prisma Client API参考资料中可用操作的更多信息。

从数据库中检索所有用户记录

// Run inside `async` functionconst allUsers = await prisma.user.findMany()
在每个返回的User对象上包括posts关系
// Run inside `async` functionconst allUsers = await prisma.user.findMany({include: { posts: true },})
筛选所有包含“prisma”的Post记录
// Run inside `async` function
const filteredPosts = await prisma.post.findMany({where: {OR: [{ title: { contains: 'prisma' } },{ content: { contains: 'prisma' } },],},
})
在同一查询中创建新用户和新发布记录
// Run inside `async` function
const user = await prisma.user.create({data: {name: 'Alice',email: 'alice@prisma.io',posts: {create: { title: 'Join us for Prisma Day 2020' },},},
})
更新现有Post记录
// Run inside `async` function
const post = await prisma.post.update({where: { id: 42 },data: { published: true },
})

与TypeScript一起使用

请注意,使用TypeScript时,此查询的结果将是静态类型的,这样您就不会意外访问不存在的属性(编译时会发现任何拼写错误)。在文档中的“生成类型的高级使用”页面上了解有关利用Prisma客户端生成类型的更多信息。

典型的Prisma工作流

如上所述,有两种方法可以将数据模型“获取”到Prisma模式中。根据您选择的方法,Prisma的主要工作流程可能会有所不同。

Prisma迁移

使用Prisma的集成数据库迁移工具Prisma Migrate,工作流程如下:

  • 手动调整Prisma数据模型
  • 使用prisma Migrate dev CLI命令迁移开发数据库
  • 在应用程序代码中使用Prisma客户端访问数据库

prisma-migrate-development-workflow

To learn more about the Prisma Migrate workflow, see:

  • Deploying database changes with Prisma Migrate
  • Developing with Prisma Migrate

SQL迁移和内省

如果由于某种原因,您不能或不想使用Prisma Migrate,您仍然可以使用内省从数据库架构更新Prisma架构。使用SQL迁移和内省时的典型工作流略有不同:

  1. 使用SQL或第三方迁移工具手动调整数据库架构
  2. (重新)内省数据库
  3. (可选)重新配置Prisma客户端API)
  4. (重新)生成Prisma客户端
  5. 在应用程序代码中使用Prisma客户端访问数据库

prisma-evolve-app-workflow

要了解有关内省工作流程的更多信息,请参阅 introspection section.

文章链接

【GraphQL】什么是Prisma? | 程序员云开发,云时代的程序员.

欢迎收藏【架构师酒馆】和【开发者开聊】

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

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

相关文章

JVM——内存溢出和内存泄漏

目录 1. 内存溢出和内存泄漏内存泄漏的常见场景解决内存溢出的思路1.发现问题 – Top命令2.发现问题 – VisualVM3.发现问题 – Arthas4.发现问题 – Prometheus Grafana5.发现问题 – 堆内存状况的对比![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/058d113715b…

BIO、NIO、selector、Netty代码Demo示例

文章目录 (一)BIO(Blocking I/O 阻塞I/O)(二)NIO(Non-Blocking I/O 非阻塞I/O)(三)IO多路复用--Selector(四)Netty (一&am…

【hacker送书第5期】SQL Server从入门到精通(第5版)

第5期图书推荐 内容简介作者简介图书目录参与方式 内容简介 SQL Server从入门到精通(第5版)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了SQL Server开发所必需的各方面技术。全书分为4篇共19章,…

优化机器学习:解析数据归一化的重要性与应用

在机器学习中,数据归一化是一种数据预处理的技术,旨在将数据转换为相似的范围或标准化的分布。这样做的主要目的是消除不同特征之间的量纲差异或数值范围差异,以确保模型在训练时更稳定、更有效地学习特征之间的关系。 通常,机器…

智能优化算法应用:基于水循环算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于水循环算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于水循环算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.水循环算法4.实验参数设定5.算法结果6.参考文献7.…

安卓apk抓包

起因 手机(模拟器)有时候抓不到apk的包,需要借助Postern设置一个代理,把模拟器的流量代理到物理机的burp上。 解决方案 使用Postern代理,把apk的流量代理到burp。 Postern是一个用于代理和网络流量路由的工具&#xf…

C++ day44完全背包问题 零钱兑换Ⅱ 组合总和Ⅳ

完全背包:一个物品可以使用无数次,将01背包中倒序遍历背包变成正序遍历背包 遍历顺序:在完全背包中,对于一维dp数组来说,其实两个for循环嵌套顺序是无所谓的! 先遍历物品,后遍历背包可以&#…

win10 下 mvn install 报错:编码GBK不可映射字符

问题背景 由于jenkins需要部署不同的项目,需要使用不同的jdk版本,所以需要配置单独的settings.xml,使用指定的jdk版本进行编译,这里需要单独的maven设置,在配置完后进行mvn的install的时候,由于存在中文注释…

Maven——Maven使用基础

1、安装目录分析 1.1、环境变量MAVEN_HOME 环境变量指向Maven的安装目录,如下图所示: 下面看一下该目录的结构和内容: bin:该目录包含了mvn运行的脚本,这些脚本用来配置Java命令,准备好classpath和相关…

Cytoscape软件下载、安装、插件学习[基础教程]

写在前面 今天分享的内容是自己遇到问题后,咨询社群里面的同学,帮忙解决的总结。 关于Cytoscape,对于做组学或生物信息学的同学基本是陌生的,可能有的同学用这个软件作图是非常溜的,做出来的网络图也是十分的好看&am…

【海思SS528 | VDEC】MPP媒体处理软件V5.0 | VDEC的使用总结

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

距离“全自动”漏洞挖掘又近了一步!腾讯安全大数据实验室论文入选ACM CCS 2023

计算机领域国际权威学术顶会ACM CCS 2023于11月26日在丹麦哥本哈根开幕。腾讯安全大数据实验室团队论文《Hopper: Interpretative Fuzzing for Libraries》被大会收录,昨天,实验室研究员谢雨轩受邀出席大会进行主题分享。 该论文提出了解释性模糊测试&a…

UCSC基因组浏览器用法

UCSC基因组浏览器用法 UCSC基因组浏览器是一个强大的在线工具,主要用于查看和分析多种生物的基因组数据。这个浏览器最初是由加利福尼亚大学圣克鲁兹分校的生物信息学家和计算生物学家开发的,旨在为科研人员提供一个易于访问和使用的界面,用于…

Java数据结构之《合并线性表》问题

一、前言: 这是怀化学院的:Java数据结构中的一道难度中等偏下的一道编程题(此方法为博主自己研究,问题基本解决,若有bug欢迎下方评论提出意见,我会第一时间改进代码,谢谢!) 后面其他编程题只要我…

freertos任务调度机制深度分析(以RISC-V架构为例)

1、前言 本文是以RISC-V架构为例进行讲解,在汇编代码层面和ARM架构不一样,但是整体框架是一样的侧重任务调度底层机制讲解,讲解代码只保留了基本功能,可配置的功能基本都已经删除本文是以可抢占式调度机制进行讲解RISC-V架构只支持…

【ZEDSLAM】Ubuntu18.04系统ZED 2i双目相机SDK安装、联合标定、SLAM测试

0.设备、环境和说明 笔记本电脑i5-8300H、GTX 1060、32GRAM 因为后面要测试Vins-Fusion和ORB-SLAM3,所以推荐安装Ubuntu 18.04(或者Ubuntu 20.04) ROS 1(不建议用比Ubuntu18更低的版本) ROS一键安装命令:…

智能监控平台/视频共享融合系统EasyCVR接入RTSP协议视频流无法播放原因是什么?

视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能/大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼…

网络入门---网络编程预备知识

目录标题 ifconfigip地址和mac地址的区别端口号pid和端口号UDP和TCP的初步了解网络字节序socket套接字 ifconfig 通过指令ifconfig便可以查看到两个网络接口: 我们当前使用的是一个linux服务器并是一个终端设备,所以他只需要一个接口用来入网即可&…

JVM

图来自JavaGuide 程序计数器 程序计数器是线程私有的,每个线程一份,是线程安全的;内部保存的字节码的行号,用于记录正在执行的字节码指令的地址。 java堆 java堆是线程共享的区域(线程不安全)&#xff…

ECRS生产工时分析软件:工业效率提升的隐形引擎

降本增效往往是企业开工规划的第一步。那到底降什么本,增什么效呢,对于很多企业来说,都是从采购成本入手,结果采购成本是降下来了,但是整体品质却下降了。实际上,要降本增效,优化现场管理才是企…