在 Golang 中使用 Schema-First 方法构建 GraphQL 服务器
在 Golang 中使用 Schema-First 方法构建 GraphQL 服务器
使用 CRUD 操作探索 Golang GraphQL 服务器

这是文章的 Golang 版本—— 在 Python 中使用模式优先方法构建 GraphQL 服务器。
它在 Golang 中使用完全相同的模式实现。
模式优先方法意味着我们将首先使用 GraphQL 模式定义语言编写模式。在代码优先的方法中,我们将使用库 API 构建我们的模式。
我们将使用[ gqlgen](https://gqlgen.com/getting-started/) 作为我们的 Golang 架构优先 GraphQL 库。
项目概况
我们将构建处理 CRUD 操作的 GraphQL 服务器 书 在里面 书店 .
简单地说,我们将把这本书的信息存储在我们的数据库中。为了简化这个项目,我没有使用任何类型的数据库;我只是使用了一个内存存储,并更专注于 GraphQL 部分。
服务器操作
- 添加书籍
- 凭身份证取书
- 按类型列出书籍
- 列出所有书籍
- 更新本书
- 删除图书
构建 GraphQL 服务器
入门
- 让我们创建我们的项目目录。
- 初始化 Go 模块
去模组初始化<dirname>.
gqlgen
- 通过以下方式获取我们的包裹
去 github.com/99designs/gqlgen - 初始化 gqlgen
去运行 github.com/99designs/gqlgen init - 跑
去整理一下获取所需的软件包

Go module

gqlgen init
此时,我们可以看到graphql目录下的各种文件和文件夹。目录图是 gqlgen 在我们输入后生成的 在里面 命令。

模型/model_gen.go — 这是一个文件,其结构由 gqlgen 生成并由模式文件定义 架构.graphqls
生成/生成.go — 这是一个包含生成代码的文件,它为每个查询和突变注入上下文和中间件。
您不应该修改这些文件中的任何一个,因为它们将在我们更新架构并生成时被 gqlgen 修改。
图/resolver.go — 是根图解析器类型。该文件不会重新生成。这是我们声明应用程序依赖项的文件,例如我们的数据库。
架构.graphqls — 是一个定义类型、查询和突变的 GraphQL 模式文件。模式文件使用模式定义语言 (SDL) 以人类可读的方式描述数据类型和操作(查询/突变)。
schema.resolvers.go — 是一个 Go 文件,其中定义了查询和突变的包装代码 架构.graphqls
定义我们的模式
我邀请您以自己的方式和要求定义架构并实现代码。
- 删除文件内容
图/schema.graphqls(由 gqlgen 生成) - 删除示例代码
schema.resolvers.go - 继续定义我们自己的模式
图/schema.graphqls
我计划有一些 GraphQL 对象类型,可以保存一些关于 图书 在我们的 书店 .
这里我有两种对象类型和一种枚举类型来描述一个 书 .
书 类型具有以下字段:
标题— 字符串类型且不可为空book_id— 身份证类型类型— 枚举类型作者— 数组作者类型和不可为空
作者 类型:
姓名— 字符串类型且不可为空邮件— 字符串类型
书籍类型 枚举类型:
- 有两个值(
小说,非小说类)
以上类型是处理的基本类型 图书 信息。
现在我们继续为我们的 GraphQL 服务定义入口点。
查询类型
我有以上 询问 具有以下三个字段的类型:
-
书— 通过提供book_id在论据中 -
图书— 获取可用书籍的列表 -
获取手册— 获取请求类型的书籍列表。这获取类型参数是可选的。它的默认值为小说.类型 GetBookResult{
存在 : 布尔值!
书 : 书
}
这 获取图书结果 类型有两个字段:
存在— 布尔类型且不可为空。他们告诉给定的书籍信息是否存在book_id书— 书籍类型
突变类型
突变类型具有三个字段:
add_book— 通过提供输入在我们的书店中创建图书资源,响应是请求的状态。更新书— 更新现有图书信息,响应为请求状态。删除书— 删除具有给定图书 ID 的图书并返回操作状态。
以上类型用于 add_book 突变类型的字段。
这 更新输入 和 放置状态 类型用于 更新书 的领域 突变 类型。
输入删除状态{
_错误_ : 布尔值!
_描述_ : 细绳
}
删除状态 类型用于 删除书 的领域 突变 类型。
我们到了 Schema 定义的结尾。
产生
一旦我们完成了我们的模式,我们需要使用生成 gqlgen 文件 去运行 github.com/99designs/gqlgen 生成 .这是它创建的所有命令:

missing go.sum entry and resolution
在运行此命令时,如果您遇到诸如缺少 go.sum 条目之类的错误,则将这些包添加到 go.sum 中。大多
_去 github.com/99designs/gqlgen_这将解决错误。然后执行生成命令。
至此,我们已经为我们的模式生成了 Go 文件。继续实施我们的解析器。
GraphQL 服务器实现
内存存储
正如我所提到的,我将使用内存中的数据存储(只是一个变量)来存储书籍的信息。
初始化我们的 书店 变量在 解析器.go .
来看看里面的内容 解析器.go 文件:
封装图 // 此文件不会自动重新生成。
//
// 它作为你的应用程序的依赖注入,在这里添加你需要的任何依赖。 类型解析器结构{}
现在,让我们添加我们的 书店 (清单 图书 ) 到 解析器 结构。
一切就绪,除了解析器实现。
解析器实现
当我们打开文件时, 图/schema.resolvers.go ,我们可以看到最初的样板代码 产生 通过 gqlgen 生成命令。
我们必须修改我们的解析器方法来执行我们的要求。
修改方法包括:
添加书更新书删除书书图书获取手册
基本上什么都有!
添加书
在我们实施我们的 添加书 方法,我们需要一个逻辑来生成唯一的 Book ID。
这是我在添加新书时查找下一本书 ID 的实现:
现在,我们的 添加书 的方法实现:
addbook method implementation
更新书
要更新现有图书,请执行以下操作:
删除书
从 书店 ,这里是代码:
书籍,书籍,Getbooks
要按 ID 获取书籍、按类型获取书籍列表或获取所有书籍,方法如下:
完整的解析器代码
现在我们的实现已经很好了,让我们继续为客户服务。
服务客户
通过以下方式启动服务器 去运行 server.go .
server.go 是初始化 gqlgen 项目时生成的 Go 文件。这个 server.go 将指向我们的 Query 和 Mutations 的解析器。

go run server.go
突变添加簿

查询书

突变更新书

查询书籍

查询 GetBook

突变删除书

我们可以使用任何 GraphQL 客户端来访问该服务。
概括
在本文中,我们看到了如何使用 gqlgen 库(模式优先方法)在 Golang 中构建我们自己的 GraphQL 服务器。
你可以在我的网站上找到这个项目 GitHub .谢谢阅读。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

浙公网安备 33010602011771号