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

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

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 解析器从数据库中检索请求的数据 - 这就是 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-first 方法还是像 Nexus 或 TypeGraphQL 这样的 code-first 方法,都可以在 GraphQL 解析器中使用 Prisma。

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

GraphQL Tools (SDL-first)

GraphQL Tools — SDL-First

当使用 SDL-first 方法构建 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 (code-first)
TypeGraphQL (code-first)

GraphQL Tools — SDL-First

当使用 SDL-first 方法构建 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。