简易数据库访问
GraphQL 服务器中

使用 Prisma 在 GraphQL 中查询 MySQL、PostgreSQL 和 SQL Server 数据库——为 JavaScript 和 TypeScript 打造的更优秀的 ORM。

tech

什么是 Prisma?

Prisma 提供了数据库工具,是构建高性能 Next.js 应用程序并实现卓越开发体验的理想伴侣。

ORM

Prisma ORM 是最流行的 TypeScript ORM。它提供了人类可读的模式、自动化迁移以及直观、完全类型安全的查询 API。

了解更多关于 Prisma ORM

Postgres

Prisma Postgres 是第一个无冷启动的无服务器数据库。它基于单核操作系统(unikernels),运行在裸机上,并内置缓存、高性能查询和无缝扩展——所有这些都提供了卓越的开发体验。

了解更多关于 Prisma Postgres

Prisma 和 GraphQL 如何协同工作

GraphQL 提供了一种强大的方式,让 Web 和移动应用程序可以从 API 获取数据。然而,作为一名后端开发者,您仍然需要通过实现 GraphQL 解析器来负责您的 GraphQL 服务器如何从数据库检索请求的数据——这就是 Prisma ORM 的用武之地。Prisma ORM 用于 GraphQL 解析器内部,以查询数据库。它与您在 GraphQL 生态系统中所有喜爱的工具和库无缝集成。

您还可以使用我们的附加工具来增强 Prisma ORM 的使用
Prisma Accelerate 是一个全球数据库缓存和可扩展连接池,可加速您的数据库查询。
Prisma Pulse 使您能够以类型安全的方式构建响应式、实时应用程序。Pulse 是实现 GraphQL 订阅或实时查询的完美伴侣。

Prisma 模式

Prisma 模式使用 Prisma 的建模语言来定义您的数据库模式。它使数据建模变得简单直观,尤其是在建模关系时。

Prisma 模式的语法深受 GraphQL SDL 启发。如果您已经熟悉 SDL,那么学习如何使用它来建模数据库表将轻而易举。

1// Define the `User` table in the database
2model User {
3 id String @id @default(cuid())
4 email String @unique
5 password String
6 name String?
7 posts Post[]
8}
9
10// Define the `Post` table in the database
11model Post {
12 id String @id @default(cuid())
13 title String
14 content String?
15 authorId String
16 author User @relation(fields: [authorId], references: [id])
17}

Prisma 和 GraphQL 用例

Prisma 可用于您的 GraphQL 解析器中,无论您是使用 graphql-tools 中的 makeExecutableSchema 进行 SDL 优先的方法,还是使用 Nexus 或 TypeGraphQL 等代码优先的方法。

注意: 以下所有示例均使用 express-graphql 作为 GraphQL 服务器,但它们也适用于任何其他库,如 Apollo Server、NestJS 或 Mercurius。

GraphQL 工具(SDL 优先)

GraphQL 工具 — SDL 优先

当使用 SDL 优先的方法构建您的 GraphQL 模式时,您将提供作为字符串的GraphQL 模式定义和一个实现此定义的解析器映射。在您的解析器内部,您可以使用 Prisma Client 读取和写入数据库中的数据,以解析传入的 GraphQL 查询和变更。

1import { PrismaClient } from '@prisma/client';
2import express from 'express';
3import { graphqlHTTP } from 'express-graphql';
4import { makeExecutableSchema } from '@graphql-tools/schema';
5
6const prisma = new PrismaClient();
7
8const typeDefs = `
9 type User {
10 email: String!
11 name: String
12 }
13
14 type Query {
15 allUsers: [User!]!
16 }
17`;
18
19const resolvers = {
20 Query: {
21 allUsers: () => {
22 return prisma.user.findMany();
23 }
24 }
25};
26
27export const schema = makeExecutableSchema({
28 resolvers,
29 typeDefs,
30});
31
32const app = express();
33app.use('/graphql', graphqlHTTP({
34 schema,
35}));
36
37app.listen(4000);
Nexus(代码优先)
TypeGraphQL(代码优先)

GraphQL 工具 — SDL 优先

当使用 SDL 优先的方法构建您的 GraphQL 模式时,您将提供作为字符串的GraphQL 模式定义和一个实现此定义的解析器映射。在您的解析器内部,您可以使用 Prisma Client 读取和写入数据库中的数据,以解析传入的 GraphQL 查询和变更。

1import { PrismaClient } from '@prisma/client';
2import express from 'express';
3import { graphqlHTTP } from 'express-graphql';
4import { makeExecutableSchema } from '@graphql-tools/schema';
5
6const prisma = new PrismaClient();
7
8const typeDefs = `
9 type User {
10 email: String!
11 name: String
12 }
13
14 type Query {
15 allUsers: [User!]!
16 }
17`;
18
19const resolvers = {
20 Query: {
21 allUsers: () => {
22 return prisma.user.findMany();
23 }
24 }
25};
26
27export const schema = makeExecutableSchema({
28 resolvers,
29 typeDefs,
30});
31
32const app = express();
33app.use('/graphql', graphqlHTTP({
34 schema,
35}));
36
37app.listen(4000);

为什么选择 Prisma 和 GraphQL?

端到端类型安全

为您的应用程序获取一致的类型,从数据库到前端,以提高生产力并避免错误。

优化的数据库查询

Prisma 内置的数据加载器确保优化的、高性能的数据库查询,即使是 N+1 查询也不例外。

类型安全的数据库客户端

Prisma Client 确保完全类型安全的数据库查询,并提供自动补全等优点——即使在 JavaScript 中也是如此。

直观的数据建模

Prisma 的建模语言受 GraphQL SDL 启发,让您可以直观地描述您的数据库模式。

简易数据库迁移

将您的 Prisma 模式映射到数据库,这样您就不需要编写 SQL 来管理您的数据库模式。

过滤、分页和排序

Prisma Client 通过为常见数据库功能提供便捷的 API 来减少样板代码。

Timeline from GraphCool to Prisma and Nexus Schema

我们热爱 GraphQL

在 Prisma,我们热爱 GraphQL 并相信其光明的未来。自运营 Graphcool(一个流行的 GraphQL BaaS),我们过去为 GraphQL 生态系统做出了很多贡献,并且仍在投资各种帮助开发者采用 GraphQL 的工具。

我们也是 GraphQL 基金会 的自豪成员,并帮助推动 GraphQL 社区和生态系统向前发展。

我们的 GraphQL 资源

GraphQL 周刊

一份关于 GraphQL 社区和生态系统的每周新闻稿

GraphQL 柏林见面会

GraphQL 柏林见面会始于 2016 年,是世界上最受欢迎的 GraphQL 见面会之一

如何使用 GraphQL

我们创建了流行的全栈 GraphQL 教程网站《如何使用 GraphQL》,以帮助开发者了解 GraphQL。

© . All rights reserved.