jet 是编译期代码生成工具和类型安全 sql 构建库,需用 jet cli 生成 .gen/ 下的 go 代码并显式导入,不提供运行时服务、连接池或 orm 功能,sql 执行与事务由开发者通过 database/sql 自行管理。

Jet 不是拿来“部署”的中间件或服务,它是一个编译期代码生成工具 + 类型安全 SQL 构建库,直接集成进 Go 项目即可运行。你不需要启动 Jet 进程、配置端口或做服务注册——它不走网络,也不占运行时资源。
jet CLI 安装后必须在构建前执行
Jet 的核心价值来自生成的 .gen/ 目录下类型安全的 Go 代码,这些代码必须在你写查询之前生成,并随项目一起编译。常见错误是:只安装了 jet 命令但没跑生成步骤,结果 import 报错找不到包。
- 必须用
go install github.com/go-jet/jet/v2/cmd/jet@latest安装 CLI(不是go get库本身) - 生成命令必须带完整 DSN 和 schema 名,例如:
jet -dsn=postgresql://user:pass@localhost:5432/mydb?sslmode=disable -schema=public -path=./.gen - 生成路径建议固定为
./.gen,并加进.gitignore;不要手动修改生成文件 - 如果数据库结构变更,重新运行
jet命令即可刷新全部类型,无需改业务代码
SQL 构建器需显式导入生成的 table/model 包
Jet 不提供全局注册或自动发现机制,所有表、字段、枚举都来自生成代码,必须显式 import。容易踩坑的是路径拼错或用了旧包名。
- 假设生成路径是
./.gen/mydb/public/table,则必须写import "./.gen/mydb/public/table"(注意是相对路径,不是模块路径) - 字段名默认大驼峰(如
table.User.UserID),但实际 DB 列名可能是小写加下划线(user_id),这由生成时的配置决定,别硬编码字符串匹配 - 不要混用 raw SQL 字符串和 Jet 构建器,比如
WHERE(table.User.Name == "foo")是类型安全的,而WHERE("name = 'foo'")会绕过检查,失去 Jet 的意义
执行查询必须自己管理 database/sql.Conn 或 *sql.DB
Jet 只负责生成 SQL 字符串和参数,不封装连接池或事务控制。它和 database/sql 是正交关系,你要自己传入 *sql.DB 或 sql.Tx。
- 构建语句后调用
stmt.Sql()得到(string, []interface{}),再交给db.Query()或tx.Exec() - 多表 JOIN 查询中,若涉及 NULL 值字段(如外键未关联),生成的 struct 字段类型会是
sql.NullString等,不能直接赋值给普通string,需判空或用.Scan() - 复杂嵌套结果(如 1:N 关系)无法靠单个
SELECT自动展开,得手写两次查询 + 手动关联,Jet 不做 ORM 式懒加载
最常被忽略的一点:Jet 生成的代码依赖 github.com/go-jet/jet/v2 运行时库,但这个库本身不处理连接生命周期。如果你在微服务里用连接池(比如 db.SetMaxOpenConns()),Jet 完全感知不到——它只管“生成正确 SQL”,剩下的全是你的事。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











