golang实现连接多数据源

  |   0 评论   |   0 浏览

我这里使用的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)

}


标题:golang实现连接多数据源
作者:zytops
地址:https://zytops.com/articles/2023/05/06/1683347460238.html