You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

59 lines
2.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

### 同时操作部署在不同服务器的多种数据库
> 1.本项目骨架在 [数据库操作单元测试](../test/gormv2_test.go) 已经提供了同时操作多服务器、多种数据库的示例代码,为了将此功能更清晰地展现出来,本篇将单独进行介绍.
> 2.面对复杂场景,需要多个客户端连接到部署在多个不同服务器的 `mysql`、`sqlserver`、`postgresql` 等数据库时, 由于配置文件config/gorm_v2.yml只提供了一份数据库连接无法满足需求这时您可以通过自定义参数直接连接任意数据库获取一个数据库句柄供业务使用.
### 相关代码
> 1.这里直接提取了相关的单元测试示例代码,更多其他操作仍然建议参考单元测试示例代码.
```code
func TestCustomeParamsConnMysql(t *testing.T) {
// 定义一个查询结果接受结构体
type DataList struct {
Id int
Username string
Last_login_ip string
Status int
}
// 设置动态参数连接任意多个数据库以mysql为例进行单元测试
// 参数结构体 Write 和 Read 只有设置了具体指才会生效否则程序自动使用配置目录config/gorm_v.yml中的参数
confPrams := gorm_v2.ConfigParams{
Write: struct {
Host string
DataBase string
Port int
Prefix string
User string
Pass string
Charset string
}{Host: "127.0.0.1", DataBase: "db_test", Port: 3306, Prefix: "tb_", User: "root", Pass: "DRsXT5ZJ6Oi55LPQ", Charset: "utf8"},
Read: struct {
Host string
DataBase string
Port int
Prefix string
User string
Pass string
Charset string
}{Host: "127.0.0.1", DataBase: "db_stocks", Port: 3306, Prefix: "tb_", User: "root", Pass: "DRsXT5ZJ6Oi55LPQ", Charset: "utf8"}}
var vDataList []DataList
//gorm_v2.GetSqlDriver 参数介绍
// sqlType mysql 、sqlserver、postgresql 等数据库库类型
// readDbIsOpen 是否开启读写分离1表示开启读数据库的配置那么 confPrams.Read 参数部分才会生效; 0 则表示 confPrams.Read 部分参数直接忽略(即 读、写同库)
// confPrams 动态配置的数据库参数
// 此外,其他参数,例如数据库连接池参数等,则直接调用配置项数据库连接池参数,基本不需要配置,这部分对实际操作影响不大
if gormDbMysql, err := gorm_v2.GetSqlDriver("mysql", 0, confPrams); err == nil {
gormDbMysql.Raw("select id,username,status,last_login_ip from tb_users").Find(&vDataList)
fmt.Printf("Read 数据库查询结果:%v\n", vDataList)
res := gormDbMysql.Exec("update tb_users set real_name='Write数据库更新' where id<=2 ")
if res.Error==nil{
fmt.Println("write 数据库更新成功")
}else{
t.Errorf("单元测试失败,相关错误:%s\n",res.Error.Error())
}
}
}
```