beego 多库配置需用前缀区分(如 dev_dbhost),appconfig.string 无法重复读取同名 key;orm 操作须用 newormwithdb("alias") 指定库,并注册唯一 alias;连接串必须含 charset=utf8mb4、parsetime=true 和 loc=local。

beego.AppConfig.String 读取多库配置项必须区分前缀
Beego 不支持直接在 app.conf 里用同一个 key 名定义多个数据库连接参数。如果你写两遍 dbhost = localhost,后一个会覆盖前一个。必须用语义化前缀隔离,比如 dev_dbhost 和 prod_dbhost。
常见错误现象:程序只连上了一个库,另一个库的配置始终读不到,beego.AppConfig.String("dbhost") 返回空字符串或默认值。
- 配置文件中使用带环境/用途前缀的 key,例如:
dev_username、prod_userpwd、test_dbname - init 函数中逐个调用
beego.AppConfig.String拼接数据源,不能复用同一组变量名 - 注意端口号是字符串类型,
dev_dbport值应为"3306"而非3306(app.conf中所有值都是字符串)
orm.RegisterDataBase 的 alias 参数决定运行时库选择
每个数据库连接必须注册唯一 alias,比如 "default"、"dev"、"test"。后续所有 ORM 操作(orm.NewOrm()、orm.QueryTable())都靠这个 alias 绑定到具体连接。
容易踩的坑:注册了 dev 和 test 两个库,但代码里始终只调用 orm.NewOrm() —— 它默认使用 "default",跟其他 alias 无关。
- 注册示例:
orm.RegisterDataBase("dev", "mysql", dev_db_data_source) - 使用指定库:
o := orm.NewOrmWithDB("dev")(注意不是NewOrm()) - 别漏掉驱动注册:
orm.RegisterDriver("mysql", orm.DRMySQL)必须在任何RegisterDataBase之前执行
MySQL 连接串里 charset=utf8 是必要参数
不加 ?charset=utf8 或 ?charset=utf8mb4,中文插入会变问号或报错 Incorrect string value,尤其在 MySQL 8.0+ 默认 collation 改为 utf8mb4_0900_ai_ci 后更明显。
拼接连接串时,建议统一用 utf8mb4,兼容 emoji 和四字节 UTF-8 字符:
dev_db_data_source := dev_username + ":" + dev_userpwd + "@tcp(" + dev_dbhost + ":" + dev_dbport + ")/" + devdbname + "?charset=utf8mb4&parseTime=True&loc=Local"
-
parseTime=True让 time.Time 字段能正确解析 MySQL 的 DATETIME -
loc=Local避免时区错位(如服务器时区为 UTC,但业务要求用本地时间) - 注意
&是 URL 查询参数分隔符,不是&(HTML 实体)
多个数据库共存时,model struct 的 TableName 方法要小心
Beego ORM 默认按 struct 名生成表名(如 User → user),但如果你在不同库中建了同名表(如 dev.user 和 prod.user),没问题;如果表名不同(如 dev.users_v2 和 prod.users_legacy),就必须重写 TableName() 方法。
否则 ORM 会固定查 user 表,跨库时可能查错表或报 table doesn't exist。
- 示例写法:
func (u *User) TableName() string { return "users_v2" } - 该方法只影响表名,不影响库选择 —— 库还是由
NewOrmWithDB("dev")决定 - 如果某 model 只用于一个库,可不写;若需动态切换,就得在
TableName()里根据当前 alias 返回不同名(需自行维护映射)
app.conf 里的 staging_dbhost,却忘了在 init 里同步更新变量名和 RegisterDataBase 的第一个参数,结果连的还是旧库。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











