必须显式导入 _ "github.com/lib/pq" 并在 init() 中先调 orm.registerdriver("postgres", orm.dr_postgres),再调 orm.registerdatabase("default", ...),否则 panic "unknown driver 'postgres'"。

beego/orm 连接 PostgreSQL 驱动注册失败
常见错误是 panic: driver: unknown driver "postgres" (forgotten import?),本质是没正确引入驱动包或注册顺序错。必须确保两件事同时成立:github.com/lib/pq 被显式导入(用下划线导入),且 orm.RegisterDriver("postgres", orm.DR_Postgres) 在 orm.RegisterDataBase 之前调用。
- 驱动导入必须写成
_ "github.com/lib/pq",不能省略下划线,否则包不会执行 init 函数 -
orm.RegisterDriver和orm.RegisterDataBase都得放在init()函数里,且前者必须在后者之前 - 连接字符串中
sslmode=disable不可省略(除非你明确配置了 SSL),否则 PostgreSQL 12+ 默认拒绝非 SSL 连接
PostgreSQL 字段类型与 beego/orm 模型字段不匹配
beego/orm 对 PostgreSQL 的类型映射不如 MySQL 完善,比如 serial 主键、timestamp with time zone、jsonb 等容易出问题。模型定义时需主动适配,而非依赖自动推导。
-
Id int64对应 PostgreSQL 的bigserial或bigint;若用serial(即integer),应改用int - 时间字段推荐统一用
time.Time类型,并在数据库中建为timestamp without time zone,避免时区解析歧义 -
jsonb字段不能直接映射到string,需用map[string]interface{}或自定义 struct + 实现driver.Valuer和sql.Scanner
RunSyncdb 自动建表在 PostgreSQL 中不创建约束和索引
orm.RunSyncdb("default", false, true) 会建表、建字段、设主键,但**不会生成外键约束、唯一索引、检查约束或默认值表达式**——这是 beego/orm 的固有限制,不是配置问题。
- 外键必须手动在 migration 文件中用
m.SQL("ALTER TABLE ... ADD CONSTRAINT ...")补上 - 唯一索引建议通过
bee generate migration创建迁移文件,再写m.SQL("CREATE UNIQUE INDEX ...") - 如果依赖
default值(如created_at timestamp DEFAULT now()),必须在 SQL 迁移中显式定义,RunSyncdb不识别 struct tag 中的orm:"default(now())"
切换到 GORM 后事务嵌套失效
Beego 项目中若用 GORM 替代原生 orm,常误以为 db.Transaction() 可以多层嵌套。实际上 GORM v2 的事务不支持真正的嵌套:内层 Transaction() 会复用外层事务对象,Rollback() 一次就全部回滚,没有保存点(savepoint)语义。
- 需要局部回滚时,必须显式调用
tx.SavePoint("sp1")和tx.RollbackTo("sp1") - Beego 控制器方法里不应每次请求都
gorm.Open(),而应在init()或main()中初始化一次全局*gorm.DB - 使用
db.WithContext(ctx)传递请求上下文,避免 goroutine 泄漏和 context deadline 丢失











