结论是:选dao生成器必须先确定项目使用的orm框架(gorm/sqlc/ent),三者生成逻辑互不兼容;gorm项目应优先用gormgen,若已有带gorm标签的struct则禁用sqlc,因其不识别gorm tag会导致字段映射错误。

直接说结论:别从“学Go语言”出发去选DAO生成器,先确定你项目里用的是 gorm、sqlc 还是 ent——这三者生成逻辑完全不同,混用会白忙活半天。
gorm 项目该用 gormgen 还是 gen?
如果你的 model struct 已经写了 gorm.Model 或带 gorm:"column:xxx" 标签,就别碰 sqlc。它不认 GORM tag,生成的代码和你手写的 struct 对不上,运行时字段映射全错。
-
gormgen(官方维护)适合快速生成基础 CRUD,命令简单:gentool -dsn "user:pass@tcp(127.0.0.1:3306)/db" -tables "users,orders" -
gen(GORM v2 内置)更灵活,能配合接口写动态 SQL,但需要手写main.go配置OutPath和ModelPkgPath,路径写错会导致生成文件消失在某个子目录里 - 注意:
gen默认不生成软删除逻辑(如DeletedAt),得手动加g.ApplyBasic(...)前调用g.WithoutContext并确保 model 有gorm.DeletedAt字段
sqlc 生成失败常见报错怎么修?
sqlc generate 报错基本卡在三件事上,不是语法问题,是配置和环境对不上。
-
packages[].path指向的目录不存在,或含中文/空格 → 改成绝对路径,比如/Users/me/project/query,别用./query - SQL 文件里用了
$1占位符,但sqlc.yaml里engine设成了postgresql,而你连的是 MySQL → 必须保持一致,MySQL 就写mysql,PostgreSQL 就写postgresql -
SELECT * FROM users JOIN profiles ON users.id = profiles.user_id→ 两个表都有id,生成会失败 → 改成SELECT users.id AS user_id, profiles.id AS profile_id, ... - 生成后编译报
undefined: pgtype.JSONB→ 说明用了 PostgreSQL 特有类型,得手动go get github.com/jackc/pgtype并在生成文件顶部加import "github.com/jackc/pgtype"
ent 和 sqlc 的关键区别在哪?
ent 的 schema 是 Go 代码写的(比如 field.Text("name")),生成器靠它推导全部关系;sqlc 只读 SQL 文件,不关心 Go struct。这意味着:
- 用 ent:改字段类型只要动
schema文件,ent generate一次全同步,model、dao、relation 全更新 - 用 sqlc:SQL 文件里写
SELECT name, created_at FROM users,它才生成对应 struct;少写一列,struct 就少一个字段,没人提醒你漏了 - ent 对多对多、边表、逆向查询支持原生,sqlc 得手写 JOIN SQL —— 学习成本不在生成器本身,而在你愿不愿意把表结构定义迁移到 Go 代码里
最容易被忽略的一点:所有生成器都依赖数据库连接实时读取 schema,但很多新手在本地没开 MySQL 或填错 -dsn,结果生成空文件还不报错。建议先用 mysql -u root -p -e "USE your_db; SHOW TABLES;" 确认连得通,再跑生成命令。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











