Beego 模型需显式注册、正确 tag 标注、手动同步表结构且字段必须大写导出。未注册会 panic;主键需 orm:"pk;auto";外键需 rel tag;建表须 RunSyncdb;QueryTable 必须传结构体指针而非表名。

Beego 的模型层(models)不是“定义结构体就完事”,它必须配合 orm.RegisterModel 和数据库驱动初始化才能被 ORM 识别并使用。
model 文件必须显式注册到 ORM 才能生效
Beego ORM 不会自动扫描 models/ 目录下的结构体。即使你写了合法的 struct 并加了 tag,不注册就调用 orm.Read 或 orm.QueryTable 会直接 panic:"model not registered"。
- 注册必须在
main.go的init()或应用启动早期完成,常见位置是func main()开头、beego.Run()之前 - 注册语句形如:
orm.RegisterModel(new(User), new(Order)),参数是结构体指针(不是类型名) - 如果模型分散在多个文件中,每个文件的
init()函数里都可注册,但要确保执行顺序无依赖冲突
struct tag 决定字段映射行为,不是所有 tag 都默认启用
Beego ORM 使用 struct tag 控制数据库列名、主键、空值、索引等,但部分行为需手动开启或配置:
-
orm:"pk;auto"表示主键且自增 —— 必须写,否则Insert()可能报错或插入 0 -
orm:"null"允许 NULL;不加则默认为NOT NULL,插入零值会失败 -
orm:"column(name)"显式指定列名,否则默认用字段小写下划线命名(如UserName→user_name) - 外键关联需额外定义
orm:"rel(fk)"+orm:"reverse(many)"等,且关联字段类型必须是*OtherModel或[]*OtherModel
数据库连接和表同步必须主动触发
Beego ORM 不会在启动时自动建表或迁移 —— 这是开发者职责。常见疏漏点:
- 忘记调用
orm.RunSyncdb("default", false, true):第一个参数是数据库别名(对应conf/app.conf中的db.default.*),第二个false表示不删除旧表,第三个true表示打印 SQL - 开发阶段建议设为
orm.RunSyncdb("default", false, true);生产环境严禁设为true(删表风险) - 若用 MySQL,必须提前安装驱动:
go get github.com/go-sql-driver/mysql,且app.conf中db.default.driver必须设为mysql - 字段类型变更(如
string改int)不会自动 ALTER,需手动处理或清库重跑
QueryTable 查询必须传入 model 类型,不能只传表名
Beego ORM 的查询入口是 orm.QueryTable(,不是字符串表名。误写成 orm.QueryTable("user") 会导致 "model not registered" 或空结果。
- 正确写法:
o := orm.QueryTable(&User{})(注意取地址) - 链式调用如
o.Filter("status", 1).OrderBy("-created").All(&users),All()第二个参数是目标切片指针 - 原生 SQL 查询用
orm.Raw(),但返回结果需手动 Scan,不走 ORM 映射逻辑
最容易被忽略的是:模型 struct 字段首字母必须大写(即对外可导出),否则 ORM 无法反射读写 —— 这和 Go 的可见性规则强绑定,不是 Beego 特例,但新手常在这里卡住半天。











