Beego ORM需在启动时静态注册MySQL主库(default)和PostgreSQL报表库(report),通过conf/app.conf配置参数、main.go中init()内按序调用RegisterDataBase完成,查询时须显式调用Using("alias")指定库。

Beego框架ORM需要同时连接MySQL主库和PostgreSQL报表库,不能靠改代码重编译来切库——必须在启动阶段完成多个数据源的静态注册,并在查询时显式指定目标库别名,否则所有操作都会默认打到"default"库上。
配置多个数据库连接串
在 conf/app.conf 中分别定义两套数据库参数,注意字段名不能重复且需可区分:
mysql_username = root
mysql_password = pass123
mysql_host = 127.0.0.1
mysql_port = 3306
mysql_dbname = app_main
pg_username = report_user
pg_password = rpt@2026
pg_host = 192.168.5.100
pg_port = 5432
pg_dbname = app_report
这一步漏掉任一参数(比如 pg_port 写成 string 类型而非 int)会导致 RegisterDataBase 失败但不报错,只在 NewOrm() 后首次查询时 panic。
注册多个数据源
在 main.go 的 init() 函数中,按顺序注册全部数据源。Beego ORM 要求至少一个名为 "default" 的库,其余别名可自定义:
第一步:导入驱动并注册 MySQL 驱动(可选,v2 已内置)
第二步:拼接 MySQL DSN → mysqlDSN := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8", beego.AppConfig.String("mysql_username"), beego.AppConfig.String("mysql_password"), beego.AppConfig.String("mysql_host"), beego.AppConfig.String("mysql_port"), beego.AppConfig.String("mysql_dbname"))
第三步:调用 orm.RegisterDataBase("default", "mysql", mysqlDSN)
第四步:拼接 PostgreSQL DSN → pgDSN := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable", beego.AppConfig.String("pg_host"), beego.AppConfig.String("pg_port"), beego.AppConfig.String("pg_username"), beego.AppConfig.String("pg_password"), beego.AppConfig.String("pg_dbname"))
第五步:调用 orm.RegisterDataBase("report", "postgres", pgDSN)
【必须在 NewOrm() 之前完成全部 RegisterDataBase 调用】 运行时无法新增或修改已注册的数据源,后续调用无效。
使用指定数据库执行查询
方法一:通过 o.Using(alias) 切换当前 ORM 实例绑定的库
o := orm.NewOrm()
o.Using("report") // 此后所有 o.QueryTable、o.Read 等操作都走 PostgreSQL
var reports []Report
o.QueryTable("reports").All(&reports)
方法二:用 orm.NewOrm().Using(alias) 链式调用,适合单次操作
count, _ := orm.NewOrm().Using("default").QueryTable("users").Count()
方法三:在模型结构体上加 orm:"db('alias')" 标签(仅限 Beego ORM v2.1+)
type Report struct {
Id int `orm:"auto;pk"`
Name string `orm:"db('report')"`
}
注意:事务不支持跨 alias,【o.Begin() 和 o.Commit() 必须在同一个 Using("xxx") 上下文中完成】


















