Beego ORM初始化必须严格按序执行:先匿名导入驱动,再RegisterDataBase("default", ...),然后RegisterModel,最后RunSyncdb;字段tag须完整精确,DSN需含charset=utf8mb4&parseTime=true。

Beego 的 ORM 不是“开箱即用”就能直接跑通的,初始化顺序、字段标签、连接参数三者错一个,RunSyncdb 就 panic,QueryTable 就查不到数据。
orm.RegisterDataBase 必须在 RegisterModel 和 RunSyncdb 之前调用
这是最常触发 panic: no driver found 或 database not registered 的原因。Beego ORM 不会自动推导驱动或数据库别名,所有注册必须显式、按序执行。
-
orm.RegisterDriver("mysql", ...)已被封装进github.com/go-sql-driver/mysql的匿名导入,你只需确保该包被_导入即可 -
orm.RegisterDataBase("default", "mysql", dsn)必须早于orm.RegisterModel(new(User)),否则模型注册时找不到目标数据库 -
orm.RunSyncdb("default", false, true)必须在模型注册之后 —— 它依赖已注册模型的 tag 信息生成建表语句 - 开发期建议加
orm.Debug = true,看实际执行的 SQL 是否符合预期
struct 字段 tag 缺一不可,大小写和 column 名必须严格匹配
Beego ORM 不靠字段名反射猜映射,完全依赖 orm: tag。小写字段、漏 tag、column 名拼错,都会导致字段被忽略或写入 NULL。
- 主键必须显式标注
orm:"pk;auto"(仅对int类型有效),Id字段不会自动识别为主键 - 字符串字段要配
type(varchar)和size(N),例如orm:"column(name);type(varchar);size(100)",否则默认可能是text或长度为 0 - 数据库列名是
user_name,tag 就得写orm:"column(user_name)",不能只写orm:"column(username)" - 所有字段名必须首字母大写(Go 导出规则),
name string不会被 ORM 扫描到
QueryTable.Update 不报错但没更新?检查返回值、字段 tag 和事务状态
o.QueryTable(&User{}).Filter("name", "alice").Update(map[string]interface{}{"status": 1}) 返回 int64,但值为 0 时它不 panic,也不 warn —— 这是最隐蔽的坑。
- 先检查
Filter条件是否命中:返回值为 0 表示没找到任何记录,不是失败而是“没匹配上” - 要更新的字段(如
status)必须在 struct 中定义,并带orm:"column(status)",否则 ORM 不知道该往哪列写 - 如果用了
o.Begin()开启事务,必须显式o.Commit(),否则变更只存在于事务上下文中 -
Update跳过PreUpdate钩子,批量更新无法触发模型生命周期方法
中文乱码、time.Time 写入异常?DSN 参数不能少
MySQL 连接串里漏掉关键参数,会导致数据存进去是 ???,或者时间字段变成 0001-01-01。
- 必须加
?charset=utf8mb4(不是utf8),否则 emoji 和部分生僻字会变问号 - 必须加
&parseTime=true,否则time.Time字段读写会失败或截断 - 推荐加上
&loc=Local,避免服务器时区与应用时区不一致导致时间偏移 - 完整 DSN 示例:
root:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=true&loc=Local
真正卡住人的从来不是语法,而是 tag 拼错一个字母、DSN 少一个参数、注册顺序颠倒一次 —— 这些地方没有运行时提示,只能靠日志和返回值自己盯。


















