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)