beego orm 多数据源必须在启动时静态注册,运行时不可增删;查询需显式调用 o.using("alias") 指定数据库,事务不支持跨库,且每个 alias 对应独立连接池与上下文。

Go 应用需要同时访问 MySQL 和 PostgreSQL(比如主库 MySQL、报表库 PostgreSQL),不能靠改代码重编译来切库——得在运行时动态识别并路由到对应 ORM 实例。
database/sql 连接池必须按库隔离,不能混用
同一个 *sql.DB 实例只能绑定一种驱动和 DSN。如果试图用一个连接池执行跨数据库类型的 SQL(比如在 MySQL 连接上跑 CREATE TABLE ... USING zheap),会直接报错或行为未定义。
- 每个数据库类型(MySQL/PostgreSQL/SQLite)必须创建独立的
*sql.DB实例 - 每个实例需单独调用
SetMaxOpenConns、SetMaxIdleConns、SetConnMaxLifetime - 别把不同库的
*sql.DB存进同一个 map 但共用一套连接池参数——它们互不影响,但参数要各自配
GORM 多 DB 实例注册与命名必须显式管理
GORM 的 gorm.Open 返回的是 *gorm.DB,它内部包装了底层 *sql.DB。多个数据库就得开多个 *gorm.DB 实例,并用名字区分,否则 db.Table("users") 不知道查哪个库。
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
- 用
gorm.Open分别初始化 MySQL 和 PostgreSQL 实例,例如:mysqlDB, _ := gorm.Open(mysql.Open(dsn1), ...)、pgDB, _ := gorm.Open(postgres.Open(dsn2), ...) - 通过
mysqlDB.Use(...)或pgDB.Use(...)单独加中间件(如 logger、prometheus),别全局注册 - 模型注册不依赖 DB 实例:用
mysqlDB.RegisterModel(&User{})是无效的;GORM 模型绑定发生在AutoMigrate阶段,应分别对每个 DB 调用mysqlDB.AutoMigrate(&User{})
Beego ORM 的多数据源必须提前注册,且无法运行时增删
Beego ORM 的 orm.RegisterDataBase 是全局静态注册,所有数据源必须在 init() 或应用启动早期完成注册,后续无法新增或修改已注册的 DSN。
- 注册时指定唯一 alias,例如:
orm.RegisterDataBase("mysql", "mysql", dsn1)、orm.RegisterDataBase("pg", "postgres", dsn2) - 查询时必须显式指定 alias:
o := orm.NewOrm(); o.Using("pg"),否则默认用"default" - 事务不能跨 alias:你不能在一个事务里同时提交 MySQL 和 PostgreSQL 的操作——Beego ORM 不支持分布式事务,底层仍是单个
*sql.Tx
路由逻辑别硬编码,用配置 + interface 抽离切换点
业务层不该出现 if dbType == "pg" { pgDB.Create(...) } 这种分支。容易漏改、难测、耦合重。
- 定义统一仓储接口,例如:
type UserRepository interface { GetByID(id int) (*User, error) } - 为每种数据库实现该接口:
mysqlUserRepo{db *gorm.DB}、pgUserRepo{db *gorm.DB} - 启动时根据配置(如
configs/database.yaml中的user_repo: mysql)注入对应实现 - 注意:字段映射标签可能不同(如 GORM 默认 snake_case,而 Beego ORM 可能要求全小写),同一结构体在不同 ORM 下可能需不同 tag,别强求复用一个 struct 定义
最易被忽略的是事务边界和连接池生命周期——MySQL 和 PostgreSQL 的 sql.Tx 互不兼容,哪怕你用同一个 ORM 封装,也绝不能把两个库的 BeginTx 放进同一个 defer 链。每个库的事务必须独立开启、提交、回滚。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










