使用 Go 和 gqlgen 实现 GraphQL API:实战指南
在本文中,我将分享如何使用 Go 语言和 gqlgen 框架实现一个完整的 GraphQL API。我们将构建一个包含用户、文章和评论功能的博客系统 API。
技术栈
- Go
- gqlgen (GraphQL 框架)
- MySQL (数据存储)
- Redis (缓存,可选)
项目结构
go_graphql/
├── config/
│ └── database.go # 数据库配置
├── graph/
│ ├── model/ # 数据模型
│ ├── schema.graphqls # GraphQL schema
│ └── schema.resolvers.go # Resolver 实现
├── server.go # 主程序入口
└── gqlgen.yml # gqlgen 配置文件
GraphQL Schema 设计
首先,我们需要定义 GraphQL schema,这是整个 API 的基础:
type User {
id: ID!
username: String!
email: String!
avatar: String
createdAt: String!
posts: [Post!]
comments: [Comment!]
}
type Post {
id: ID!
title: String!
content: String!
author: User!
category: Category!
createdAt: String!
updatedAt: String
comments: [Comment!]
images: [Image!]
}
type Comment {
id: ID!
content: String!
author: User!
post: Post!
createdAt: String!
}
type Query {
users: [User!]!
user(id: ID!): User
posts(categoryId: ID): [Post!]!
post(id: ID!): Post
}
type Mutation {
createUser(input: CreateUserInput!): User!
createPost(input: CreatePostInput!): Post!
createComment(input: CreateCommentInput!): Comment!
}
Resolver 实现
下面是一个完整的用户查询 resolver 实现示例:
// Users resolver 实现
func (r *queryResolver) Users(ctx context.Context) ([]*model.User, error) {
rows, err := config.DB.Query(`
SELECT id, username, email, avatar, created_at
FROM users`)
if err != nil {
return