golang: Gorm配置Mysql多数据源

时间:2025-02-28 08:21:03

1、目录结构

test
--------------
--------------
--------------common
------------------------common/mysql
------------------------common/mysql/gorm_mysql.go
------------------------common/mysql/mysql_setting.go

2、配置

{
	"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
go   get -u /gorm

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

package mysql

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

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

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

	decoder := (filePtr)
	err = (&info)
	if err != nil {
		("mysql解码失败", ())
	}

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

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

		conf2 := DBConfig{
			DsName:   ,
			Host:     ,
			Port:     ,
			Database: ,
			Username: ,
			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"

	"/driver/mysql"
	"/gorm"
	"/gorm/logger"
)

// 连接管理器
type RDBManager struct {
	OpenTx bool     // 是否开启事务
	DsName string   // 数据源名称
	Db     * // 非事务实例
	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 {
			("数据库链接失败 %s ", ())
			return
		}
		if len() == 0 {
			 = MASTER
		}
		rdb := &RDBManager{
			Db:     db,
			DsName: ,
		}
		RDBs[] = rdb
	}
}

// Setup 初始化连接
func MysqlSetup(conf DBConfig) (*, error) {
	//启用打印日志
	newLogger := (
		(, "\r\n", ), // io writer
		{
			SlowThreshold: , // 慢 SQL 阈值
			LogLevel:      , // Log level: Silent、Error、Warn、Info
			Colorful:      false,       // 禁用彩色打印
		},
	)
	// db = newConnection()
	dbURI := ("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=true",
		,
		,
		,
		,
		)
	dialector := ({
		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 := (dialector, &{
	// 	Logger: newLogger,
	// })
	conn, err := (dialector, &{
		Logger: newLogger,
	})

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

5、启动配置()

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

}

6、使用

import mysql "common/mysql"
    
db := ["db2"]
var rr []实体类
result := ().Find(&rr)