Beego ORM 默认不打印 SQL,需设 orm.Debug = true(仅对 QuerySeter 生效,且须在注册数据库后、查询前设置);Raw SQL 需手动拼接日志;syncdb -v 可查看建表 DDL。

Beego ORM 默认不打印 SQL,必须显式开启调试模式或手动构造日志逻辑,否则你看到的永远是“执行成功”但不知道实际发了什么。
beego orm.Debug = true 是最简方式,但只在开发环境生效
这个开关直接控制 ORM 层是否将生成的 SQL 输出到标准输出(通常是终端或日志文件),但它有明确限制:
- 仅对
orm.QuerySeter类型的操作生效(比如o.QueryTable("user").Filter("age__gt", 18).All(&users)) - 对
o.Raw(...).Exec()或o.Raw(...).QueryRows()不起作用——这些走的是原生 SQL 路径,绕过了 ORM 的日志逻辑 - 生产环境务必关闭,因为会暴露参数值(如密码、手机号等敏感字段)和表结构细节
- 需在调用
orm.RegisterDataBase之后、任何查询之前设置,顺序错了就无效
Raw SQL 执行时想看语句?得自己拼接并 log.Printf
o.Raw() 返回的是一个 RawSeter,它内部已解析参数并准备好了最终 SQL,但不对外暴露。你无法从返回值里取到字符串,只能靠模拟还原:
- 手动把问号替换成对应参数值(注意类型:字符串加引号、数字不加、
nil替换为NULL) - 使用
fmt.Sprintf或strings.ReplaceAll做简单替换,例如:log.Printf("SQL: %s", strings.ReplaceAll("UPDATE user SET name=? WHERE id=?", "?", "'alice'")) - 更稳妥的做法是在调用
.Exec()或.QueryRows()前,先用fmt.Sprintf构造带参数的完整 SQL,再传给o.Raw()——虽然重复写了 SQL,但调试时一目了然 - 别依赖
o.Raw(sql, args...)中的args...自动格式化,Beego 不做 SQL 字符串插值,只是占位符绑定
用 orm.RunSyncdb 同步建表时加 -v 参数可看 DDL 语句
命令行执行 ./app orm syncdb -v 会输出每张表的 CREATE TABLE 语句,这对验证模型定义是否被正确翻译成数据库结构非常有用:
立即学习“go语言免费学习笔记(深入)”;
-
-v必须和syncdb一起用,单独orm sqlall不支持该 flag - 输出的 SQL 是 Beego 根据 struct tag(如
orm:"size(100)")生成的,不含索引或外键(除非显式用orm:"pk;auto;column(id)"等复合 tag) - 如果发现字段类型不对(比如 Go 的
int64变成了 MySQL 的BIGINT UNSIGNED),优先检查驱动注册是否正确(orm.RegisterDriver("mysql", orm.DRMySQL))以及 DSN 是否含parseTime=True等影响类型推导的参数
真正容易被忽略的是:Beego ORM 的 SQL 日志没有上下文隔离。多个 goroutine 并发查库时,Debug = true 输出的 SQL 会混在一起,看不出哪条属于哪个请求。线上排查慢查询,光看 SQL 不够,还得结合 trace ID 或日志时间戳人工对齐。



















