golang: Gorm配置Mysql多数据源

1、目录结构

test
--------------main.go
--------------setting.json
--------------common
------------------------common/mysql
------------------------common/mysql/gorm_mysql.go
------------------------common/mysql/mysql_setting.go

2、setting.json配置

{
	"database": [
		{
			"DB1": {
				"dsName": "db1",
				"host": "127.0.0.1",
				"port": "3306",
				"username": "root",
				"password": "",
				"database": "数据库名称1",
				"type": "mysql"
			},
			"DB2": {
				"dsName": "db2",
				"host": "127.0.0.1",
				"port": "3306",
				"username": "root",
				"password": "",
				"database": "数据库名称2",
				"type": "mysql"
			}
		}
	]
}

3、文件引入

go   get -u gorm.io/gorm
go   get -u gorm.io/gorm

4、读取Setting.go配置文件(mysql_setting.go)

package mysql

import (
	"encoding/json"
	"fmt"
	"log"
	"os"
)

func Init_MySqlFile() {
	filePtr, err := os.Open("./setting.json")
	if err != nil {
		log.Printf("文件打开失败 [Err:%s]", err.Error())
		return
	}

	defer filePtr.Close()
	// 创建json解码器
	info := AutoGenerated{}

	decoder := json.NewDecoder(filePtr)
	err = decoder.Decode(&info)
	if err != nil {
		fmt.Println("mysql解码失败", err.Error())
	}

	//初始化数据库
	for _, v := range info.Database {
		d1 := v.DB1
		d2 := v.DB2

		conf1 := DBConfig{
			DsName:   d1.DsName,
			Host:     d1.Host,
			Port:     d1.Port,
			Database: d1.Database,
			Username: d1.Username,
			Password: d1.Password,
		}

		conf2 := DBConfig{
			DsName:   d2.DsName,
			Host:     d2.Host,
			Port:     d2.Port,
			Database: d2.Database,
			Username: d2.Username,
			Password: d2.Password,
		}

		BuildByConfig(conf1)

		BuildByConfig(conf2)
	}

}

//--json转实体
type AutoGenerated struct {
	Database []Database `json:"database"`
}

type DB1 struct {
	DsName   string `json:"dsName"`
	Host     string `json:"host"`
	Port     string `json:"port"`
	Username string `json:"username"` // 账号
	Password string `json:"password"`
	Database string `json:"database"`
	Type     string `json:"type"`
}
type DB2 struct {
	DsName   string `json:"dsName"`
	Host     string `json:"host"`
	Port     string `json:"port"`
	Username string `json:"username"` // 账号
	Password string `json:"password"`
	Database string `json:"database"`
	Type     string `json:"type"`
}

type Database struct {
	DB1 DB1 `json:"DB1"`
	DB2 DB2 `json:"DB2"`
}

5、配置MySql链接(gorm_mysql.go)

package mysql

import (
	"fmt"
	"log"
	"os"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

// 连接管理器
type RDBManager struct {
	OpenTx bool     // 是否开启事务
	DsName string   // 数据源名称
	Db     *gorm.DB // 非事务实例
	Tx     *gorm.Tx // 事务实例
	Errors []error  // 操作过程中记录的错误
}

// 数据库配置
type DBConfig struct {
	DsName   string // 数据源名称
	Host     string // 地址IP
	Port     string // 数据库端口
	Database string // 数据库名称
	Username string // 账号
	Password string // 密码
}

// db连接
var (
	MASTER = "DB1"                    // 默认主数据源
	RDBs   = map[string]*RDBManager{} // 初始化时加载数据源到集合
)

// 初始化多个数据库配置文件
func BuildByConfig(input ...DBConfig) {
	if len(input) == 0 {
		panic("数据源配置不能为空")
	}
	for _, v := range input {
		db, err := MysqlSetup(v)
		if err != nil {
			log.Printf("数据库链接失败 %s ", err.Error())
			return
		}
		if len(v.DsName) == 0 {
			v.DsName = MASTER
		}
		rdb := &RDBManager{
			Db:     db,
			DsName: v.DsName,
		}
		RDBs[v.DsName] = rdb
	}
}

// Setup 初始化连接
func MysqlSetup(conf DBConfig) (*gorm.DB, error) {
	//启用打印日志
	newLogger := logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
		logger.Config{
			SlowThreshold: time.Second, // 慢 SQL 阈值
			LogLevel:      logger.Info, // Log level: Silent、Error、Warn、Info
			Colorful:      false,       // 禁用彩色打印
		},
	)
	// db = newConnection()
	dbURI := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=true",
		conf.Username,
		conf.Password,
		conf.Host,
		conf.Port,
		conf.Database)
	dialector := mysql.New(mysql.Config{
		DSN:                       dbURI, // data source name
		DefaultStringSize:         256,   // default size for string fields
		DisableDatetimePrecision:  true,  // disable datetime precision, which not supported before MySQL 5.6
		DontSupportRenameIndex:    true,  // drop & create when rename index, rename index not supported before MySQL 5.7, MariaDB
		DontSupportRenameColumn:   true,  // `change` when rename column, rename column not supported before MySQL 8, MariaDB
		SkipInitializeWithVersion: false, // auto configure based on currently MySQL version
	})
	// conn, err := gorm.Open(dialector, &gorm.Config{
	// 	Logger: newLogger,
	// })
	conn, err := gorm.Open(dialector, &gorm.Config{
		Logger: newLogger,
	})

	if err != nil {
		log.Print(err.Error())
		return conn, err
	}
	sqlDB, err := conn.DB()
	if err != nil {
		log.Print("connect db server failed.")
	}
	sqlDB.SetMaxIdleConns(100) // 设置最大连接数
	sqlDB.SetMaxOpenConns(100) // 设置最大的空闲连接数
	sqlDB.SetConnMaxLifetime(3600)
	return conn, nil
}

5、启动配置(main.go)

func main() {
	 
	//初始化数据库
	mysql.Init_MySqlFile()

}

6、使用

import mysql "common/mysql"
    
db := mysql.RDBs["db2"]
var rr []实体类
result := db.Db.Where().Find(&rr)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Golang中使用MySQL连接池与GORM ORM库可以提高性能和效率。下面是一个简单的示例代码,展示如何使用GORMMySQL连接池: ```go import ( "fmt" "log" "gorm.io/driver/mysql" "gorm.io/gorm" ) func main() { // 配置MySQL连接信息 dsn := "user:password@tcp(127.0.0.1:3306)/database?charset=utf8mb4&parseTime=True&loc=Local" // 使用连接池创建数据库连接 db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { log.Fatal(err) } // 设置连接池的最大空闲连接数和最大打开连接数 sqlDB, err := db.DB() if err != nil { log.Fatal(err) } sqlDB.SetMaxIdleConns(10) sqlDB.SetMaxOpenConns(100) // 使用GORM进行数据库操作 // 这里可以写入你的业务逻辑 // 关闭数据库连接 err = db.Close() if err != nil { log.Fatal(err) } fmt.Println("MySQL连接池示例代码执行完毕") } ``` 在上面的示例中,我们首先配置MySQL连接信息,包括用户名、密码、主机和端口以及数据库名称。然后使用`gorm.Open`方法打开数据库连接,并通过`db.DB()`方法获取到底层的`*sql.DB`实例,以便设置连接池的最大空闲连接数和最大打开连接数。最后,我们可以使用GORM进行数据库操作。在结束时,记得调用`db.Close()`关闭数据库连接。 请注意,上述示例代码中使用了`gorm.io/gorm`和`gorm.io/driver/mysql`模块,这是GORM的最新版本。在你的代码中,可能需要替换成你当前使用的GORM版本的模块路径。 希望对你有帮助!如有更多问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行人已

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值