golang实现连接多数据源
我这里使用的gorm的框架连接数据库。
1、配置文件内容config.yaml
server:
#设置运行模式,debug开发模式,release生产模式
appMode: debug
httpPort: 8888
db1:
driverName: mysql
host: 192.168.100.10
port: 5236
database: xxxxx
username: xxxxx
password: xxxxx
charset: GB18030
db2:
driverName: mysql
host: 192.168.100.10
port: 5236
database: xxxxx
username: xxxxx
password: xxxxx
charset: GB18030
dm:
driverName: dm
host: 192.168.100.10
port: 5236
database: xxxxxxx
username: xxxxxxx
password: xxxxxxxx
charset: GB18030
2、使用viper解析配置文件
package utils
import (
"github.com/spf13/viper"
"os"
"path"
)
var (
AppMode string
HttpPort string
Db1 DB1
Db2 DB2
Dm DM
)
type DB1 struct {
DriverName string
Host string
Port string
Database string
Username string
Password string
Charset string
}
type DB2 struct {
DriverName string
Host string
Port string
Database string
Username string
Password string
Charset string
}
type DM struct {
DriverName string
Host string
Port int
Database string
Username string
Password string
Charset string
}
func init() {
// 配置viper,依次是:获取当前工作目录(是项目主目录)、读取的文件名、文件类型、文件路径、检查
workDir, _ := os.Getwd()
viper.SetConfigName("config")
viper.SetConfigType("yaml")
viper.AddConfigPath(path.Join(workDir + "/config"))
// viper.AddConfigPath("/config")
err := viper.ReadInConfig()
if err != nil {
panic(err)
}
// server
AppMode = viper.GetString("server.appMode")
HttpPort = viper.GetString("server.httpPort")
// db1数据库参数
Db1 = DB1{
DriverName: viper.GetString("db1.driverName"),
Host: viper.GetString("db1.host"),
Port: viper.GetString("db1.port"),
Database: viper.GetString("db1.database"),
Username: viper.GetString("db1.username"),
Password: viper.GetString("db1.password"),
Charset: viper.GetString("db1.charset"),
}
// db2数据库参数
Db2 = DB2{
DriverName: viper.GetString("db2.driverName"),
Host: viper.GetString("db2.host"),
Port: viper.GetString("db2.port"),
Database: viper.GetString("db2.database"),
Username: viper.GetString("db2.username"),
Password: viper.GetString("db2.password"),
Charset: viper.GetString("db2.charset"),
}
// dm数据库参数
Dm = DM{
DriverName: viper.GetString("dm.driverName"),
Host: viper.GetString("dm.host"),
Port: viper.GetInt("dm.port"),
Database: viper.GetString("dm.database"),
Username: viper.GetString("dm.username"),
Password: viper.GetString("dm.password"),
Charset: viper.GetString("dm.charset"),
}
}
3、连接数据库
package database
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"lfxt-api/utils"
"time"
)
var (
Db1 *gorm.DB
Db2 *gorm.DB
)
func InitMySQlDB() {
ConnDB1()
ConnDB2()
}
// ConnDB1 连接db1数库
func ConnDB1() {
var err error
// 连接数据库
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=True&loc=Local",
utils.Db1.Username,
utils.Db1.Password,
utils.Db1.Host,
utils.Db1.Port,
utils.Db1.Database,
utils.Db1.Charset,
)
Db1, err = gorm.Open(mysql.New(mysql.Config{
DSN: dsn,
DefaultStringSize: 256, // string 类型字段的默认长度
DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置}), args)
}), &gorm.Config{})
if err != nil {
panic("连接数据库失败:" + err.Error())
}
sqlDB, _ := Db1.DB()
// SetMaxIdleConns 设置空闲连接池中的最大连接数。
sqlDB.SetMaxIdleConns(10)
// SetMaxOpenConns 设置数据库连接最大打开数。
sqlDB.SetMaxOpenConns(100)
// SetConnMaxLifetime 设置可重用连接的最长时间
sqlDB.SetConnMaxLifetime(time.Hour)
}
// ConnDB2 连接db2数库
func ConnDB2() {
var err error
// 连接数据库
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=True&loc=Local",
utils.Db2.Username,
utils.Db2.Password,
utils.Db2.Host,
utils.Db2.Port,
utils.Db2.Database,
utils.Db2.Charset,
)
Db2, err = gorm.Open(mysql.New(mysql.Config{
DSN: dsn,
DefaultStringSize: 256, // string 类型字段的默认长度
DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置}), args)
}), &gorm.Config{})
if err != nil {
panic("连接数据库失败:" + err.Error())
}
sqlDB, _ := Db2.DB()
// SetMaxIdleConns 设置空闲连接池中的最大连接数。
sqlDB.SetMaxIdleConns(10)
// SetMaxOpenConns 设置数据库连接最大打开数。
sqlDB.SetMaxOpenConns(100)
// SetConnMaxLifetime 设置可重用连接的最长时间
sqlDB.SetConnMaxLifetime(time.Hour)
}