简单的数据库访问
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 用例

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

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

GraphQL Tools (SDL 优先)

GraphQL Tools — SDL 优先

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

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 查询和 mutation。

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 Weekly

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

GraphQL 柏林聚会

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

How to GraphQL

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