Beego ORM 查询失败的根源是模型定义不规范和注册顺序错乱;需显式声明字段 column、时间类型、主键自增,严格按驱动→数据库→模型顺序注册,并确保 QueryTable 表名与实际库表一致。

模型定义不规范或注册顺序错乱,是 Beego ORM 查询失败最常被忽略的两个根源。 你写的 User 结构体再完整,只要没在 init() 里注册,或者数据库驱动没提前加载,QueryTable("user") 就会静默返回空结果或 panic。
模型字段 tag 必须显式声明 column 名称
Beego ORM 不做驼峰转蛇形的默认映射(除非你用 TableName() + 默认命名规则),字段名和数据库列名不一致时,Filter() 或 One() 会查不到数据,且无报错提示。
- 错误写法:
Name string→ ORM 默认找name列,但实际表中是user_name - 正确写法:
Name string `orm:"column(user_name)"` - 时间字段必须指定类型:
CreatedAt time.Time `orm:"column(created_at);type(datetime)"`,否则可能被当成字符串或解析失败 - 主键和自增不能省:
Id int `orm:"column(id);pk;auto"`,漏掉pk会导致Update()和Delete()失效
RegisterModel 和 RegisterDataBase 的调用顺序不能颠倒
Beego ORM 初始化是强顺序依赖的:驱动 → 数据库 → 模型。任意一步缺失或错序,后续所有查询都会失败。
- 必须先匿名导入驱动:
_ "github.com/go-sql-driver/mysql" - 再调用
orm.RegisterDataBase("default", "mysql", "user:pass@tcp(...)/db") - 最后才是
orm.RegisterModel(new(User), new(Article)) - 如果在
RegisterDataBase前就调用orm.NewOrm(),会 panic:"database not registered"
QueryTable 的表名参数必须与实际数据库表名严格一致
QueryTable("user") 中的字符串不是模型名,而是数据库里真实的表名。模型名(结构体名)和表名可以不同,靠 TableName() 方法桥接。
- 结构体叫
User,但表名叫users→ 必须实现:func(u *User) TableName() string { return "users" } - 直接写
QueryTable("User")(首字母大写)或QueryTable("user_info")(但实际表是userinfo)都会查不到数据 - 多表关联时,
RelatedSel()依赖的是模型间 tag 定义(如rel(one)),不是表名拼写,这点容易混淆
最容易被跳过的其实是 TableName() 方法——很多人以为结构体名自动转小写下划线就是表名,但 Beego 只对纯驼峰名(如 AuthUser → auth_user)做默认转换,带下划线或大小混写(如 CLogin)会出错。真要省事,不如显式写死表名。











