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 等主流关系型数据库,能够自动处理关联关系、分页、过滤和聚合操作。
项目信息
- 项目地址:github.com/dosco/graphjin
- 开发语言:Go
- 原项目名:super-graph
- 所属分类:生态项目与库
帮助我们改进文档
发现翻译问题或内容错误?请告诉我们。
