【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     String
  content   String?
  published Boolean @default(false)
  author    User?   @relation(fields: [authorId], references: [id])
  authorId  Int?
}

model User {
  id    Int     @id @default(autoincrement())
  email String  @unique
  name  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` function

const allUsers = await prisma.user.findMany()
在每个返回的User对象上包括posts关系
// Run inside `async` function

const 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? | 程序员云开发,云时代的程序员.

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

柯桥学英语,商务外贸英语,BEC中级写作冲刺干货

think of… as 把……认为 eager to… 渴望 look forward to Ving 期待/盼望…… accept…as 接受……为 be certain of 对……确信 in contact with 与……接触 in accordance with 与……相符/一致 remind…of 提醒……关于 be advantageous to 有利于…… assure…of使……放…

mysql8报sql_mode=only_full_group_by(存储过程一直报)

1:修改数据库配置(重启失效) select global.sql_mode;会打印如下信息 ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION里面包含 ONLY_FULL_GROUP_BY,那么就重新设置,在数据库中输入以下代码,去掉ONLY_FULL_GROU…

WordPress 外链跳转插件

WordPress 外链跳转插件是本站开发的一款WordPress插件,能对文中外链添加一层过滤,有效防止追踪,以及提醒用户。 类似于知乎、CSDN打开其他链接的提示。 后台可以设置白名单 学习资料源代码:百度网盘 密码:123

电子学会C/C++编程等级考试2022年09月(三级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:课程冲突 小 A 修了 n 门课程, 第 i 门课程是从第 ai 天一直上到第 bi 天。 定义两门课程的冲突程度为 : 有几天是这两门课程都要上的。 例如 a1=1,b1=3,a2=2,b2=4 时, 这两门课的冲突程度为 2。 现在你需要求的是这 n 门课…

Adobe Illustrator绘图解决卡顿问题

最近在用AI做矢量图,但是遇到了一个很难搞的问题,当我们需要分辨率较高的图片的时候,Python用Matplotlib生成的pdf时dpi参数会设置为600及以上,但是样子的话就造成了pdf文件过大以及AI卡顿,比如,下午生成的…

多文件夹图片预处理:清除空值、重置大小、分割训练集

→ 清理空值 防止出现cannot identify image file 参考Python数据清洗----删除读取失败图片__简单版_python用pil读取图片出错删除掉-CSDN博客 import os import shutil import warnings import cv2 import iofrom PIL import Image warnings.filterwarnings("error&qu…

UE 事件分发机制(二) day10

自定义事件分发机制 自建事件分发机制与结构 Unreal推荐的游戏逻辑开发流程 基于 Unreal推荐的游戏逻辑开发流程,一般我们的整体规划也就是这样 大致结构类图 创建接口类与管理类以及所需函数 新建一个Unreal接口类作为接口 然后创建一个蓝图函数库的基类 Ev…

Python基础:推导式(Comprehensions)详解

1. 推导式概念 Python推导式(comprehensions)是一种简洁而强大的语法,用于从已存在的数据(列表、元组、集合、字典等)中创建新的数据结构。推导式包括: 列表推导式元组推导式字典推导式集合推导式 2. 列表…

mybatis参数输入 #{}和${}

1、建库建表 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSERT INTO t_emp(emp_name,emp_salary) VALUES("tom",200.33); INSERT INTO…

基于ssm亚盛汽车配件销售业绩管理系统

摘 要 如今的信息时代,对信息的共享性,信息的流通性有着较高要求,因此传统管理方式就不适合。为了让亚盛汽车配件销售信息的管理模式进行升级,也为了更好的维护亚盛汽车配件销售信息,亚盛汽车配件销售业绩管理系统的开…

快速操控鼠标行为!Vue鼠标按键修饰符让你事半功倍

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! ⭐ 专栏简介 欢迎来到前端入门之旅!这个…

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

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

甘草书店记:2023年10月15日 星期日 「等待也是人生的大事」

我常说,最好的人生是刚刚好。 财富不可少,也不必多,够用就好。爱情不要晚,也不要早,恰好就好。 可是人生活在社会中、自然中,不会万事由己。所以,等待是人生的必修课。 书店的装修设计和LOGO…

Tomcat及JDK下载安装(Linux系统)

前言 Tomcat是一个开源的Web应用服务器,由Apache软件基金会管理和维护。它的主要功能是处理来自客户端的HTTP请求,生成并返回响应结果。Tomcat不仅可以实现Java Servlet和JavaServer Pages(JSP)等Web编程模型的支持,也…

STM32开发学习(地址映射)

LED灯代码: #define PERIPH_BASE ((unsigned int)0x40000000)#define AHB1PERIPH_BASE (PERIPH_BASE 0x00020000)#define GPIOF_BASE (AHB1PERIPH_BASE 0x1400)#define GPIOF_MODER *(unsigned int*)(GPIOF_BASE0x00) #define GPIOF_BSRR *(uns…

使用自动化测试获取手机短信验证码

目前在职测试开发,,写一些脚本,个人认为这职业不科学不应该有的职业,测试就是测试,开发就是开发,运维还是老鸟,这行业总能折腾些莫名其妙的东西出来,刚做这行时学的第一门语言是bash shell, 去新去单位上班直接写了个一键搭建测试环境的测试脚本,本来不想干测试了,好好做微信小…

idea不需安装插件,自动生成mybatis-plus对应的实体类entity,带注解@TableName、@TableId、@TableField

目录 1、修改Generate poJOs.groovy文件 2、idea中连接数据库 3、生成entity代码 4、查看生成的实体类 1、修改Generate poJOs.groovy文件 在项目下方点击Scratches and Consoles→ Extensions→ Database Tools and SQL箭头→schema→ Generate POJOs.groovy 替换为以下文…

tomcat调优配置

一. 设置账户进入管理页面 通过浏览器进入Tomcat7的管理模块页面&#xff1a;http://localhost:8080/manager/status 按照提示&#xff0c;在Tomcat7服务器指定的位置修改配置文件&#xff08;conf/tomcat-users.xml&#xff09;&#xff0c;增加相应的用户和角色配置标签 <…

10个火爆的设计素材网站推荐

所谓聪明的女人没有米饭很难做饭&#xff0c;设计师也是如此。如何找到优秀的设计材料是每个设计师的痛点&#xff0c;国内材料网站收费&#xff0c;但也限制使用范围和期限&#xff0c;大多数外国设计网站不能打开或需要特殊互联网使用&#xff0c;有一定的安全风险。 作为一…

微服务实战系列之Redis(cache)

前言 云淡天高&#xff0c;落木萧萧&#xff0c;一阵西北风掠过&#xff0c;似寒刀。冬天渐渐变得更名副其实了。“暖冬”的说法有点言过其实了。——碎碎念 微服务实战系列之Cache微服务实战系列之Nginx&#xff08;技巧篇&#xff09;微服务实战系列之Nginx微服务实战系列之F…