Beego ORM连接MySQL必须调用orm.RegisterDataBase,且需下划线导入MySQL驱动;DSN须含parseTime=true和loc=Local,否则time.Time字段操作失败;model须注册并调用RunSyncdb,字段标签首字母必须大写。

orm.RegisterDataBase 是 Beego ORM 连接 MySQL 的核心入口,不调用它就根本不会建立数据库连接——哪怕你装了驱动、写了 model、甚至跑了 RunSyncdb。
必须导入 MySQL 驱动且用下划线导入
Go 的 database/sql 机制要求:驱动包必须被“引用”,但又不需要直接调用其函数。所以必须用 _ "github.com/go-sql-driver/mysql" 这种形式导入。
常见错误现象:
- 编译通过,但运行时报错
sql: unknown driver "mysql" (forgotten import?) - Beego 启动时无报错,但所有 ORM 操作都返回
no such table或空结果(实际是连接根本没建立)
确认方式:检查 main.go 或 models/init.go 中是否真有这行导入,且没被注释或拼错路径。
orm.RegisterDataBase 的 DSN 字符串必须带 parseTime=true 和 loc=Local
MySQL 的 DATETIME / TIMESTAMP 类型在 Go 中映射为 time.Time,缺这两个参数会导致:
立即学习“go语言免费学习笔记(深入)”;
- 读取时间字段时 panic:
parsing time "" as "2006-01-02T15:04:05Z07:00": cannot parse "" as "2006-01-02" - 写入时间字段失败,或存成
0000-00-00 00:00:00
正确写法示例:
orm.RegisterDataBase("default", "mysql", "root:pass@tcp(127.0.0.1:3306)/mydb?charset=utf8mb4&parseTime=true&loc=Local")
注意:& 是 URL 查询参数分隔符,不是 &;utf8mb4 比 utf8 更安全(支持 emoji);loc=Local 避免时区转换错误。
model 注册和表同步不能跳过 RegisterModel 和 RunSyncdb
即使只读数据,也得先注册结构体,否则 QueryTable("User") 会找不到对应表映射。
-
orm.RegisterModel(new(User))必须在RegisterDataBase之后调用 -
RunSyncdb("default", false, true)中第三个参数为true表示自动建表(开发期方便),上线前应设为false并手动管理 schema - 字段标签如
orm:"pk;auto"必须首字母大写,小写字段不会被 ORM 识别
典型结构体定义:
type User struct {
Id int `orm:"pk;auto"`
Name string `orm:"size(64)"`
Created time.Time `orm:"auto_now_add;type(datetime)"`
}
配置文件里读取参数要小心类型和空格
从 conf/app.conf 读字符串再拼 DSN 很常见,但容易踩坑:
-
beego.AppConfig.String("db_port")返回的是字符串,不能直接拼进整数位置,得确保值是"3306"而不是" 3306 "(前后空格) - 密码含特殊字符(如
@、/、:)必须 URL 编码,否则 DSN 解析失败 - 推荐做法:开发期用硬编码 DSN,上线再切到配置文件;或者统一用
url.QueryEscape处理敏感字段
最易忽略的一点:Beego 默认不校验配置项是否存在。AppConfig.String("nonexistent") 返回空字符串,拼出来的 DSN 就是 @tcp(:)/?,连接必然失败,但错误信息很模糊——得自己加非空判断。


















