beego 的 bee generate scaffold 字段类型不匹配需手动修正:tinyint(1) 改为 bool 并加 orm:"column(x)",datetime 改为 time.time 并加 orm:"auto_now_add;type(datetime)";蛇形表名须显式加 orm:"table(test_device)";路由需手动注册;gorm 不兼容 bee 生成器,应换用 gormt 等工具。

bee generate scaffold 生成的 struct 字段类型不匹配怎么办
beego 的 bee generate scaffold 默认按字段名后缀或 MySQL 类型做简单映射,比如 user_name → UserName string,但常出现 TINYINT(1) 被映为 int(应为 bool),或 DATETIME 映为 string(应为 time.Time)。这不是 bug,是工具保守策略。
解决方法只有手动改 models/user.go:
- 把
gender int改成Gender bool,并在结构体 tag 加`orm:"column(gender)"`保持映射 - 把
created_at string改成CreatedAt time.Time,并加`orm:"auto_now_add;type(datetime)"` - 所有
int类型字段,先查表定义:若列是INT(11) UNSIGNED,应改用uint或uint64,避免 ORM 插入时溢出
表名含下划线时生成的 model 文件名和 struct 名不一致
比如数据库表叫 test_device,bee generate scaffold test_device ... 会生成文件 models/test_device.go,但里面 struct 名是 TestDevice —— 这没问题;但如果你后续用 orm.RegisterModel(new(TestDevice)),Beego ORM 会默认找表名 testdevice(驼峰转蛇形去掉了下划线),而不是 test_device。
必须显式指定表名:
- 在 struct 定义里加
`orm:"table(test_device)"`tag - 或者统一用
orm.RegisterModelWithPrefix("test_", new(TestDevice))(不推荐,易混乱) - 更稳妥的是:建表时尽量用纯驼峰命名(如
testdevice),避免下划线 —— Beego ORM 对蛇形表名支持弱,且不同版本行为不一致
bee generate 不生成 router 和 controller 方法绑定逻辑
执行 bee generate scaffold user 后,controllers/user.go 里确实有 Create、Update 等方法,但访问 /user 仍 404。这是因为:
-
bee generate scaffold不动routers/router.go,也不会自动调用beego.Include(&controllers.UserController{}) - 如果你用的是 Beego 2.x(v2.0+),
beego.Include()已废弃,必须改用beego.Router("/user", &controllers.UserController{}, "get:List;post:Create") - 别漏掉
_ "github.com/go-sql-driver/mysql"导入 —— 没它,orm.RegisterDataBase会静默失败,日志无报错,但 DB 查询全返回空
想用 GORM 替代 beego orm,还能用 bee generate 吗
不能直接用。bee 工具只适配 beego orm 的 tag 规范(如 orm:"pk;auto"),GORM 用的是 gorm:"primaryKey;autoIncrement",两者不兼容。
如果项目已决定切 GORM:
- 删掉所有
models/*.go里 beego orm 的 tag,重写为 GORM tag - 放弃
bee generate,改用gormt或gorm-gen这类专为 GORM 设计的反向生成工具 - 注意:GORM 的
AutoMigrate默认不会删除字段,而 beego orm 的RunSyncdb(..., true)会清空旧表重建 —— 迁移策略完全不同,别混用
最易被忽略的一点:无论用哪个 ORM,main.go 中的数据库注册顺序不能错 —— 必须先 RegisterDataBase,再 RegisterModel(beego orm)或先 gorm.Open 再 AutoMigrate(GORM),顺序颠倒会导致运行时 panic 或静默失效。











