- 后端
- 数据库
- GraphQL
【免费下载链接】prisma1
💾 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL & MongoDB) [deprecated]
本篇指南聚焦 Prisma(1.x,已弃用)的核心能力——Prisma API:讲解一个 Prisma service 如何基于其数据模型自动生成一套 GraphQL CRUD 接口,并支持数据库事件驱动的实时订阅;同时结合仓库源码,深入解析使用 GraphQL Playground 探索 API 的完整姿势(
prisma playground命令的底层实现、HTTP endpoint 的直连方式),并补充服务鉴权(JWT service token)与错误处理等实战要点。读完你可以在自己的 Prisma service 上快速定位、验证并安全调用任意查询、变更与订阅操作。
什么是 Prisma API?
在 Prisma 中,一个Prisma service会对外暴露一个GraphQL API,这个 API 是根据已部署的 数据模型.md)自动生成的,官方称之为Prisma API。
Prisma API 的核心能力可以概括为两块:
- 针对数据模型中每个类型(Type)的 CRUD 操作:即对节点的增(create)、查(query)、改(update)、删(delete)。
- 数据库实时事件订阅:当数据库发生事件时(例如新节点被created、已有节点被updated或deleted),客户端可以实时收到通知。
换句话说,你不需要手写一行服务端业务代码,只要维护一份数据模型文件,Prisma 就会为你生成一整套可直接调用的 GraphQL 接口。
Prisma database schema
Prisma API 的具体形态由一个对应的 GraphQL schema 定义,这个 schema 被称为Prisma database schema。
它和数据模型是"一体两面"的关系:
| 概念 | 说明 |
|---|---|
| 数据模型(Data Model) | 用 SDL 编写的.graphql文件(如datamodel.graphql),描述业务类型、字段与关系,是"输入" |
| Prisma database schema | 由数据模型自动推导生成的完整 GraphQL schema,定义Query、Mutation、Subscription三类根类型上可用的全部操作,是"输出" |
关于二者更详细的差异(字段的增删、@unique标注、系统字段id/createdAt/updatedAt的只读特性等),可以参考 Data Modelling (SDL).md) 中的"Prisma database schema vs data model"章节。
从数据模型到 API:自动生成的完整链路
Prisma API 完全围绕数据模型构建。一条典型的链路如下:
- 编写数据模型:在一个或多个
.graphql文件中定义类型,例如datamodel.graphql:
type Tweet { id: ID! @unique createdAt: DateTime! text: String! owner: User! location: Location! } type User { id: ID! @unique createdAt: DateTime! updatedAt: DateTime! handle: String! @unique name: String tweets: [Tweet!]! }- 在
prisma.yml中声明数据模型路径:
datamodel: datamodel.graphql- 执行
prisma deploy同步到服务端:部署成功后,服务端会基于数据模型生成对应的数据库 schema,并为每个类型挂载 CRUD 操作,同时推导出全部关系(例如上面的TweetToUser双向关系)。prisma deploy支持--dry-run预演、--force接受破坏性变更、--watch监听文件变更自动重部署等参数,详见 prisma-deploy 命令参考。
数据模型决定了 API 的全部操作面
数据模型中的每个元素都会映射到 API 操作上(详见 Concepts 章节):
- Queries(查询参考):
- 查询某个模型的单个或多个节点;
- 跨关系查询节点;
- 跨关系聚合查询(如
postsConnection上的aggregate { count })。
- Mutations(变更参考):
- 对某个模型的节点进行 create / update / upsert / delete;
- 跨关系进行 create、connect、disconnect、update、upsert;
- 对某个模型进行批量 update / delete(如
updateManyPosts、deleteManyPosts)。
- Subscriptions(订阅参考):
- 节点被创建、更新、删除时实时通知。
从源码结构看,Prisma 服务端的 GraphQL 引擎正是围绕这三类根类型组织 schema 的(参见 server/servers/api 下按操作类别划分的 Scala 源码),这印证了"数据模型 → Prisma database schema → 三类操作"的生成链路。
几个重要的 API 概念
在探索 API 之前,理解下面几个概念能帮你少走弯路:
- 节点选择(Node selection):多数操作通过
where参数选取节点。任何标注了@unique的字段都可以用于定位节点。例如按id更新单个节点:
mutation { updatePost( where: { id: "ohco0iewee6eizidohwigheif" } data: { title: "GraphQL is awesome" } ) { id } }批量操作(Batch operations):
updateManyPosts/deleteManyPosts这类批量变更针对大量节点做了优化,只返回受影响数量count而不返回节点详情。注意:批量变更不会触发订阅事件!连接查询(Connections):基于 Relay Connection 模型,除了分页信息外还支持聚合。例如统计所有未发布文章:
query { postsConnection { aggregate { count } edges { node { title } } } }事务性变更(Transactional mutations):非批量操作的单个 mutation 总是事务性执行——即使它横跨多个关系、写入多个类型。任一动作失败(如违反
@unique约束)则整个变更回滚,且变更过程对外隔离(atomic + isolated)。这对嵌套变更尤为重要。级联删除(Cascading deletes):通过
@relation指令的onDelete参数控制关联节点的删除行为,可选CASCADE(连带删除)或SET_NULL(引用字段置空)。
探索 Prisma API:GraphQL Playground 完全指南
GraphQL Playground 是探索 Prisma API 的最佳工具:你可以用它运行 GraphQL 查询、变更和订阅,边写边看响应,还能浏览完整的 schema 文档。
打开 Playground 有两种方式:
方式一:prisma playground命令
在 service 的工作目录下直接运行:
prisma playground该命令会读取当前目录的prisma.yml与 GraphQL 配置(通过graphql-config及graphql-config-extension-prisma扩展补全 endpoint),在本地启动一个内置的 Playground 服务并自动打开浏览器。
从 playground 命令源码 可以看出其完整行为:
- 如果本机安装了 macOS 版 GraphQL Playground 桌面应用,优先以
graphql-playground://协议拉起桌面应用; - 否则(或传了
--server-only/--web/ 指定--port时)启动一个 Express 服务器:/playground路由挂载 Playground 页面,/graphql路由通过express-request-proxy把请求代理到真实的 API endpoint,端口默认3000; - 启动后打印
Serving playground at http://localhost:3000/playground并自动opn()打开该地址。
支持的命令行参数如下:
-w, --web 强制打开 Web 版 Playground -e, --env-file ENV-FILE 指定 .env 文件注入环境变量 -p, --project PATH Prisma 定义文件(prisma.yml)路径 -s, --server-only 只启动本地服务器,不自动打开浏览器 -p, --port PORT Playground Web 版服务端口(隐含 --web,默认 3000)方式二:直接在浏览器粘贴 HTTP endpoint
Playground 本身是一个可以部署到任意 endpoint 上的 Web 应用,因此你也可以把 service 的 HTTP endpoint(形如http://localhost:4466/service/stage)直接粘贴到浏览器地址栏中打开。
提示:Prisma service 的 HTTP endpoint 通常由
cluster、service与stage共同决定;这些值在 prisma.yml 配置 中定义,也可以在 Playground 里通过服务端自动生成的 schema 文档浏览全部可用操作。
在 Playground 中验证三类操作
以 Queries 章节 中的示例数据模型(Post/User)为例:
type Post { id: ID! @unique title: String! published: Boolean! author: User! } type User { id: ID! @unique email: String! @unique name: String! posts: [Post!]! }在 Playground 左侧依次输入并执行:
# 查询:获取所有 Post 的 id 与 title query { posts { id title } }# 变更:新建一篇已发布的 Post 并关联作者 mutation { createPost( data: { title: "Hello Prisma" published: true author: { connect: { email: "hello@graph.cool" } } } ) { id title } }# 订阅:实时接收新 Post 的创建事件(在另一个标签页执行 mutation 即可看到推送) subscription newPosts { post(where: { mutation_in: [CREATED] }) { mutation node { title } } }订阅走的是独立的 WebSocket endpoint(协议为graphql-subscriptions),在 Playground 中可直接切换标签运行;若在代码中使用,可借助apollo-link-ws建立连接,详见 Subscriptions 章节。
保护你的 Prisma API:service secret 与 JWT 鉴权
Prisma API 通常通过 service secret 保护(在prisma.yml的secret字段中配置)。调用 API 时,需要在 HTTP 请求头中携带用该 secret 签名的 JWT:
Authorization: Bearer __TOKEN__JWT 必须包含两类 claim:
exp:过期时间(必须晚于当前时间);service:服务名与 stage(如my-service@prod),须与当前请求的目标一致。
服务端会验证 token 的签名、exp与service三者全部匹配才放行。
生成 service token
- 用 CLI 生成:在 service 目录执行
prisma token即可得到一个新的 JWT;加--copy直接复制到剪贴板(对应源码实现见 token 命令,若prisma.yml未配置 secret 会提示There is no secret set in the prisma.yml)。更多参数见 prisma token 命令参考。 - 在服务端代码中生成:基于
jsonwebtoken库,用环境变量中的 secret 签名,例如:
var jwt = require('jsonwebtoken') jwt.sign( { data: { service: 'my-service@' + process.env.PRISMA_STAGE, }, }, process.env.PRISMA_SECRET, { expiresIn: '1h', } )错误处理:读懂 API 的报错响应
当查询或变更出错时,响应中会包含errors属性,携带错误code、message等信息(遵循 GraphQL 规范对错误处理的定义)。API 错误分为两类:
- 应用错误(Application errors):通常说明你的请求本身不合法——例如拼写错误、缺少必填参数、参数类型不对等。应检查输入与错误信息是否吻合。
- 内部服务器错误(Internal server errors):说明 Prisma service 内部发生了意外,应查看 service 日志定位。对本地集群,可以使用
prisma cluster logs(参见 集群日志命令)查看日志。
一个典型的鉴权类应用错误:
{ "errors": [ { "code": 3015, "requestId": "api:api:cjc3kda1l000h0179mvzirggl", "message": "Your token is invalid. It might have expired or you might be using a token from a different project." } ] }遇到3015这类错误时,请确认 token 未过期、且是用prisma.yml中配置的 secret 签发的。更完整的错误码场景与排查建议见 Concepts 的错误处理章节。
小结与下一步
Prisma API 是 Prisma service 的对外窗口:它由数据模型自动生成,天然覆盖 CRUD 与实时订阅,并通过 Playground 提供所见即所得的探索体验。你可以按以下路线继续深入:
- 熟悉数据模型写法:Data Modelling (SDL).md);
- 掌握查询语法与过滤/排序/分页参数:Queries;
- 掌握嵌套变更与批量操作:Mutations;
- 玩转实时通知:Subscriptions;
- 为 API 加一层 JWT 保护:
prisma token+Authorization: Bearer头。
至此,你已经具备了在真实 Prisma service 上"看得见、摸得着"地使用和验证 Prisma API 的完整能力——从 Playground 的打开方式、三类操作的验证,到鉴权与排错,都能直接落地到实际项目中。
- 后端
- 数据库
- GraphQL
【免费下载链接】prisma1
💾 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL & MongoDB) [deprecated]
相关推荐
ML-For-Beginners NLP 入门:从图灵测试、Eliza 到写出第一个 Python 对话机器人
ML For Beginners NLP 入门:从图灵测试、Eliza 到写出第一个 Python 对话机器人 本篇是 ML For Beginners 课程第
后端数据库GraphQLPrisma API 全面指南:基于数据模型自动生成的 GraphQL CRUD 与实时订阅接口
Prisma API 全面指南:基于数据模型自动生成的 GraphQL CRUD 与实时订阅接口 导读 本文以 Prisma( prisma1 https://
后端数据库GraphQLPrisma API 总览:数据模型驱动的自动生成 GraphQL API 及其探索方式
Prisma API 总览:数据模型驱动的自动生成 GraphQL API 及其探索方式 Prisma 服务的核心能力之一,是为每个已部署的数据模型.md 自动
后端数据库GraphQL
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考