简化的数据库访问
GraphQL 服务器中

使用 Prisma(适用于 JavaScript 和 TypeScript 的更佳 ORM)在 GraphQL 中查询 MySQL、PostgreSQL 和 SQL Server 数据库中的数据。

tech

什么是 Prisma?

Prisma 提供了数据库工具,这些工具是使用出色的 DX 构建高性能 Next.js 应用程序的完美伴侣。

ORM

Prisma ORM 是最受欢迎的 TypeScript ORM。它带有一个人类可读的模式、自动化迁移和一个直观的、完全类型安全的查询 API。

了解有关 Prisma ORM 的更多信息

Postgres

Prisma Postgres 是第一个没有冷启动的无服务器数据库。它基于unikernels,在裸机上运行,并带有一个内置缓存、高性能查询和无缝扩展——所有这些都具有出色的 DX。

了解有关 Prisma Postgres 的更多信息

Prisma 和 GraphQL 如何协同工作

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

您还可以通过我们的附加工具来增强 Prisma ORM 的使用
Prisma Accelerate 是一个全球数据库缓存和可扩展连接池,可以加速您的数据库查询。
Prisma Postgres 是一种基于裸机服务器和基于 unikernel 的微型虚拟机构建的托管 PostgreSQL 服务,旨在实现高效率、强隔离和可预测的性能,并能够轻松扩展到数百万用户。

Prisma Schema

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 用例

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

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

GraphQL Tools (SDL 优先)

GraphQL Tools — 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 Tools — 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 柏林聚会始于 2016 年,是世界上最受欢迎的 GraphQL 聚会之一

如何学习 GraphQL

我们建立了流行的全栈 GraphQL 教程网站 How to GraphQL,以帮助开发人员了解 GraphQL。

© . This site is unofficial and not affiliated with Prisma Data, Inc.