Beego ORM 默认不输出 SQL 日志,需在 RegisterModel 后、任何查询前设置 orm.Debug = true 才生效;日志含 SQL、参数及耗时三行,全局生效且生产环境必须关闭。

Beego ORM 默认不输出 SQL 日志,需手动启用
Beego 的 orm.Debug 开关控制是否打印生成的 SQL 语句和参数,但它默认是关闭的。即使你开了日志模块、配置了数据库连接,orm.QueryTable("user").Filter("id", 1).One(&u) 这类操作也不会自动打日志——这是新手最常踩的坑。
关键点在于:必须在调用 orm.RegisterModel 之后、执行任何查询之前,显式设置 orm.Debug = true;否则无效。
如何正确开启 ORM 查询日志(Go 代码片段)
以下是最小可行配置,放在初始化 ORM 的位置(如 models/init.go 或 main.go 的 init 函数中):
func init() {
orm.RegisterDriver("mysql", orm.DRMySQL)
orm.RegisterDataBase("default", "mysql", "root:@tcp(127.0.0.1:3306)/test?charset=utf8")
<pre class="brush:php;toolbar:false;">orm.RegisterModel(new(User))
// ⚠️ 必须在这之后、任何 QueryTable 调用之前设置
orm.Debug = true}
注意:orm.Debug 是全局开关,会影响所有数据库 alias。如果只想对某个 alias 开启,目前 Beego ORM 不支持(v2.x 仍沿用此行为),只能靠日志级别或包装器过滤。
日志输出内容和常见干扰项
开启后,每条查询会输出三行:
- 第一行是原始 SQL(带问号占位符)
- 第二行是参数列表(
[]interface{}形式) - 第三行是执行耗时(如
[SQL] - 1.2ms)
容易混淆的情况:
- 如果你看到
[ORM] - Starting transaction...却没 SQL,说明你用了orm.RunTransaction但没真正执行查询 - 使用
o.LoadRelated(&obj, "Profile")时,关联查询也会单独打日志,别误以为是主表语句重复 - Beego v2+ 中若同时启用了
bee run -downdoc=true,控制台日志可能被截断,建议重定向到文件或用go run main.go直接运行观察
生产环境禁用 Debug,但想临时看某次查询?
不能只靠 orm.Debug = true,因为它是全局且不可动态切换的(设了就一直生效)。更安全的做法是:
- 用
orm.NewOrm().Raw("SELECT ...").Values(&rst)+ 手动拼 SQL(仅调试用) - 或改用
orm.DebugLog替换默认日志器,自定义输出逻辑(比如只对含"admin"的 SQL 打印) - Beego v2.1+ 支持
orm.DebugWriter设置输出目标,可指定为os.Stderr或内存 buffer,避免污染生产日志
真正上线前务必确认 orm.Debug 是 false,否则每条查询都触发反射取参数,性能损耗明显,且敏感字段可能泄露。



















