【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.hqwc.cn/news/232016.html

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

相关文章

ora.LISTENER.lsnr状态为Not All Endpoints Registered

客户的监控反馈有个监听无法连接,登录环境检查发现ora.LISTENER.lsnr的状态为Not All Endpoints Registered,如下 [rootdb2 ~]# crsctl status res -t -------------------------------------------------------------------------------- NAME …

GTSRB数据集下载分享

内容 需要留言,由于阿里云不支持.csv格式的文件分享,百某网盘速度太慢,需要的我先上传到共享网站上(奶牛快传),然后给你分享码(有时效)自行下载,我看见留言会尽快分享给你…

[笔记] 使用 xshell 记录日志

平常会使用xshell登录远程系统,在一些场景下,由于远端节点不支持下载,因此无法下载日志,此时可以通过 xshell 自带的日志功能将远端节点的日志内容导出. 1. 登录远端节点后启动日志记录 2. 指定要保存的日志文件 3. 在终端中使用 cat /path/to/logfile 将文件内容全部打印到终…

深入理解网络阻塞 I/O:BIO

🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、Java,后续其他专栏会持续优化更新迭代 🌲文章所在专栏&…

vivado综合分析与收敛技巧3

1、最优化 RAMB 输入逻辑以允许输出寄存器推断 以下 RTL 代码片段可从块 RAM ( 实际上为 ROM ) 生成关键路径 , 其中包含多个止于触发器 (FF) 的逻辑层次。 RAMB单元已在无可选输出寄存器 (DOA-0) 的情况下完成推断 , 这给 R…

Java---抽象类讲解

文章目录 1. 抽象类概述2. 抽象类特点3. 抽象类的成员特点4. 抽象类猫狗应用 1. 抽象类概述 在Java中,一个没有方法体的方法应该定义为抽象方法;而类中如果有抽象方法,该类必须定义为抽象类。 2. 抽象类特点 1. 抽象类和抽象方法必须使用abst…

关键词挖掘软件-免费批量挖掘关键词的工具

在当今数字化时代,网站的曝光和排名对于吸引流量至关重要。而在这个大数据的背后,SEO(Search Engine Optimization,搜索引擎优化)成为许多网站主和创作者们追逐的关键。在SEO的世界里,关键词的选择和优化是…

从源代码出发,Jenkins 任务排队时间过长问题的解决过程

最近开发了一个部署相关的工具,使用 Jenkins 来构建应用。Jenkins 的任务从模板中创建而来。每次部署时,通过 Jenkins API 来触发构建任务。在线上运行时发现,通过 API 触发的 Jenkins 任务总是会时不时在队列中等待较长的时间。某些情况下的…

二阶龙格塔库积分法求解混沌产生方程(求助)

最近论文中常常接触到激光产生混沌的方程,激光器作为非线性元件,在信息处理中具有非常大的潜力,其中激光产生混沌应用在通信中很有用处。论文中对于模拟数据部分,采用了以下公式来产生混沌:以此公式产生混沌的方法应用…

React Native 更换淘宝镜像提升包下载速度

React Native 更换淘宝镜像提升包下载速度 每次运行项目的时候都是卡在包下载的命令上,每次一等就要 1h20m 极度崩溃,那是因maven镜像源为Google导致无法正常下载。 那么我们就可以切换maven镜像源,方法如下: 找到项目下的**/an…

《尚品甄选》:后台系统——分类品牌和规格管理(debug一遍)

文章目录 一、分类品牌管理1.1 表结构介绍1.2 列表查询1.3 添加功能1.4 修改功能1.5 删除功能 二、商品规格管理2.1 表结构介绍2.2 列表查询2.3 添加功能2.4 修改功能2.5 删除功能 一、分类品牌管理 分类品牌管理就是将分类的数据和品牌的数据进行关联,分类数据和品…

【LeetCode刷题】-- 78.子集

78.子集 class Solution {public List<List<Integer>> subsets(int[] nums) {List<List<Integer>> ans new ArrayList<>();List<Integer> list new ArrayList<>();dfs(0,nums,ans,list);return ans;}private void dfs(int cur,int…