知海

Go:graphjin(GraphQL 转 SQL 编译器)

graphql-github-io-zh-Hans生态项目与库

graphjin:GraphQL 转 SQL 编译器

graphjin 是一款能够将 GraphQL 查询即时编译为 SQL 语句的工具。它既可作为独立服务运行,也可作为 Go 库集成到你的应用中。graphjin 的前身是 super-graph 项目。

核心特性

  • 即时编译:将 GraphQL 查询实时转换为高效的 SQL 语句,无需手动编写服务端数据查询逻辑。
  • 安全防护:编译过程自动防止 SQL 注入,并实施安全限制,避免恶意查询。
  • 性能优化:默认启用预编译缓存,支持批量数据加载(Data Loader)模式,有效防止 N+1 查询问题。
  • 声明式配置:支持通过配置文件和自定义解析器扩展数据查询逻辑,无需编写样板代码。
  • 双模式运行:既可作为独立服务快速搭建 GraphQL API,也可作为 Go 库嵌入现有项目。

快速开始

作为 Go 库使用

go 复制代码
package main

import (
    "context"
    "database/sql"
    "fmt"
    "log"
    "net/http"

    "github.com/dosco/graphjin"
    _ "github.com/jackc/pgx/v4/stdlib"
)

func main() {
    db, err := sql.Open("pgx", "postgres://postgres:password@localhost:5432/postgres")
    if err != nil {
        log.Fatal(err)
    }

    gj, err := graphjin.New(graphjin.Config{}, db)
    if err != nil {
        log.Fatal(err)
    }

    http.HandleFunc("/graphql", func(w http.ResponseWriter, r *http.Request) {
        query := `query { users { id name email } }`
        res, err := gj.GraphQL(r.Context(), query, nil)
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        w.Header().Set("Content-Type", "application/json")
        w.Write(res.Data)
    })

    log.Println("GraphQL server listening on :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

作为独立服务运行

bash 复制代码
# 安装 CLI
go install github.com/dosco/graphjin/cmd/graphjin@latest

# 初始化配置
graphjin init

# 启动服务(默认监听 8080 端口)
graphjin serve

工作原理

graphjin 通过分析 GraphQL 查询的抽象语法树(AST),结合数据库表结构元数据,自动生成最优化的 SQL JOIN 查询。它支持 PostgreSQL、MySQL 等主流关系型数据库,能够自动处理关联关系、分页、过滤和聚合操作。

项目信息

帮助我们改进文档

发现翻译问题或内容错误?请告诉我们。