当前位置:网站首页>golang: Gorm配置Mysql多数据源
golang: Gorm配置Mysql多数据源
2022-07-30 05:51:00 【行人已】
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:%[email protected](%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)
边栏推荐
- C#的访问修饰符,声明修饰符,关键字有哪些?扫盲篇
- Electron日常学习笔记
- 分布式系统中的开创者—莱斯利·兰伯特
- Electron之初出茅庐——搭建环境并运行第一个程序
- mysql高阶语句(一)
- How does Redis prevent oversold and inventory deduction operations?
- 你被MySQL 中的反斜杠 \\坑过吗?
- MySQL master-slave replication configuration construction, one step in place
- Test development engineer diary 002 - starting from 0 interface automation
- Electron使用romote报错 : Uncaught TypeError: Cannot read property ‘BrowserWindow‘ of undefined
猜你喜欢

Test Development Engineer Growth Diary 001 - Some Introduction to Agile Testing, CI/CD/CT, DecOps

《心智社会》—马文·明斯基

MySQL master-slave replication configuration construction, one step in place

No, the Log4j vulnerability hasn't been fully fixed yet?

What new materials are used in the large aircraft C919?

As a test leader, examine several aspects of job candidates

Advanced multi-threading (CountDownLatch, deadlock, thread-safe collection class)

空间直线到平面上的交点的计算证明及其源码

从 Google 离职,前Go 语言负责人跳槽小公司

空间顶点到平面的距离计算的证明及其源码
随机推荐
Bull: remove common characters
Headline 2: there are several kinds of common SQL errors in MySQL usage?
空间平面相交的直线的计算及其源码
空间直线到平面上的交点的计算证明及其源码
Rodrigues:旋转矩阵的向量表达
C#的访问修饰符,声明修饰符,关键字有哪些?扫盲篇
Selenium02
Multithreading basics (multithreaded memory, security, communication, thread pools and blocking queues)
How does Redis prevent oversold and inventory deduction operations?
删除openstack中的僵尸实例
The calculation of the determinant of the matrix and its source code
阿里二面:列出 Api 接口优化的几个技巧
PXE efficient mass network capacity
STL源码剖析:临时对象的代码测试和理解
Test development engineer diary 002 - starting from 0 interface automation
UDP和TCP使用同一个端口,可行吗?
DHCP principle and configuration
引导过程与服务控制
Process and Scheduled Task Management
node.js中实现对数据库的链式操作