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

使用 Prisma(一个更好的 JavaScript 和 TypeScript ORM)在 GraphQL 中从 MySQL、PostgreSQL 和 SQL Server 数据库中查询数据。

tech

什么是 Prisma?

Prisma 使数据操作变得轻松!它提供类型安全的 Node.js 和 TypeScript ORM,全局数据库缓存,连接池和实时数据库事件。

查询
// Creating a new record
await prisma.user.create({
firstName: “Alice”,
email: “alice@prisma.io”
})
表格
id firstName email
1 Bobby bobby@tables.io
2 Nilufar nilu@email.com
3 Jürgen jums@dums.edu
4 Alice alice@prisma.io

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

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

注意:以下所有示例都使用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 教程网站 How to GraphQL,以帮助教育开发人员了解 GraphQL。