bee generate支持model、controller、crud三类代码生成,需正确配置数据库、自定义模板路径及手动注册命名空间路由,否则易出现编译错误或404。

bee 是 Beego 官方配套的命令行工具,其代码生成能力集中在 bee generate 子命令下。它不依赖外部插件或独立二进制(如 buffalo-codegen),而是直接基于项目结构、数据库 schema 和预设模板工作。如果你看到项目里有 codegen.go 或尝试 go get github.com/gobuffalo/buffalo-beego/v2/buffalo-codegen,那不是 Beego 原生方案——容易白忙一场。
beego 的 generate 命令能生成什么
bee generate 主要支持三类产出:
- model:从数据库表反向生成 Go struct + ORM 标签(orm:"column(id)")
- controller:生成带 CRUD 方法骨架的控制器(含 Get()、Post() 等)
- crud:一次性生成 model + controller + router + view(HTML 模板),适合快速搭后台管理页
它默认读取 conf/app.conf 中的数据库配置(db.driver、db.conn),不连上真实 DB 就会报错:failed to open database: dial tcp 127.0.0.1:3306: connect: connection refused
定制模板前必须改掉的默认行为
Beego 的代码生成器用的是内置文本模板(位于github.com/beego/bee/generate/templates),但你不能直接改源码——下次 go install 升级 bee 就被覆盖。正确做法是:
- 在项目根目录建 templates/ 文件夹
- 把想改的模板(如 model.tpl、controller.tpl)从 bee 源码里拷出来,放到该目录
- 运行时加 -t templates/ 参数:
bee generate model user -t templates/
- 模板里可安全使用 {{.Fields}}、{{.TableName}} 等上下文变量,但别碰 {{.PkgName}} 这类底层字段——它们由 bee 运行时注入,硬编码会崩
常见翻车点:
- 模板里写了
import "github.com/astaxie/beego",但你的项目已升级到github.com/beego/beego/v2,导致编译失败 -
controller.tpl中用了beego.InsertFilter,而 v2 版本已废弃,应改用app.AddFilter - 生成的 HTML 模板用了
{{.Data}},但实际传入的是map[string]interface{},没做类型断言就直接{{.Data.Name}},页面渲染空白
生成 CRUD 后为什么 router 不生效
bee generate crud user 会在 routers/router.go 末尾追加类似这样的路由注册:
ns := beego.NewNamespace("/v1/user",
beego.NSInclude(
&controllers.UserController{},
),
)
但这段代码不会自动插入到 beego.Router 的主命名空间里。你得手动把它加进 beego.AddNamespace(ns) 调用中,否则请求 404。
更隐蔽的问题是:如果项目启用了 AutoRouter = false(在 conf/app.conf 里),那即使加了 AddNamespace,UserContoller 里的方法也不会被映射——因为 AutoRouter 关闭后,NSInclude 不再自动扫描方法名(Get() → GET /user)。此时必须显式写:
ns := beego.NewNamespace("/v1/user",
beego.NSRouter("/", &controllers.UserController{}, "get:Get;post:Post"),
)模板和路由这两块,是定制化过程中最常漏掉、也最难 debug 的部分。别指望生成完就能跑通,生成只是起点。


















