From e8ba4769079a2029a9c7ffeadde7971578ee9be5 Mon Sep 17 00:00:00 2001 From: Heir-o Date: Sun, 18 Aug 2024 10:13:44 +0000 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=95=B0=E6=8D=AE=E6=BA=90?= =?UTF-8?q?=E5=88=87=E6=8D=A2=20=E5=A2=9E=E5=8A=A0=E4=B8=BB=E4=BB=8E?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Heir-o --- config/app_config.go | 24 ++++++----- config/config.yaml.example | 20 +++++++--- pkg/mysql/mysql.go | 82 ++++++++++++++++++++++++++++++++------ 3 files changed, 96 insertions(+), 30 deletions(-) diff --git a/config/app_config.go b/config/app_config.go index d560665..adefb1d 100644 --- a/config/app_config.go +++ b/config/app_config.go @@ -31,19 +31,21 @@ type server struct { LogLevel string `yaml:"logLevel"` EnabledSwagger bool `yaml:"enabledSwagger"` } - type database struct { - Type string `yaml:"type"` - Host string `yaml:"host"` - Port string `yaml:"port"` - UserName string `yaml:"username"` - Password string `yaml:"password"` - DbName string `yaml:"dbname"` - MaxIdleConn int `yaml:"max_idle_conn"` - MaxOpenConn int `yaml:"max_open_conn"` - ConnMaxLifetime int `yaml:"conn_max_lifetime"` + Primary datasource `yaml:"primary"` + Secondary datasource `yaml:"secondary"` + MaxIdleConn int `yaml:"max_idle_conn"` + MaxOpenConn int `yaml:"max_open_conn"` + ConnMaxLifetime int `yaml:"conn_max_lifetime"` +} +type datasource struct { + Type string `yaml:"type"` + Host string `yaml:"host"` + Port string `yaml:"port"` + UserName string `yaml:"username"` + Password string `yaml:"password"` + DbName string `yaml:"dbname"` } - type redis struct { Host string `yaml:"host"` Port string `yaml:"port"` diff --git a/config/config.yaml.example b/config/config.yaml.example index 3050b2c..3888c71 100644 --- a/config/config.yaml.example +++ b/config/config.yaml.example @@ -7,12 +7,20 @@ server: swaggerPath: "/swagger/index.html" database: - type: mysql - host: localhost - port: 3306 - username: root - password: xxxxx - dbname: ry-go + primary: + type: mysql + host: localhost + port: 3306 + username: root + password: xx + dbname: ry-go + secondary: + type: mysql + host: localhost + port: 3306 + username: root + password: xx + dbname: ry-go max_idle_conn: 10 max_open_conn: 30 conn_max_lifetime: 300 diff --git a/pkg/mysql/mysql.go b/pkg/mysql/mysql.go index 99ea9df..b0f0f71 100644 --- a/pkg/mysql/mysql.go +++ b/pkg/mysql/mysql.go @@ -1,7 +1,6 @@ package mysql import ( - "fmt" "log" "os" "ruoyi-go/config" @@ -13,47 +12,104 @@ import ( "gorm.io/gorm/logger" ) -var once = sync.Once{} +var once sync.Once +// 定义数据库连接结构体 type connect struct { - client *gorm.DB + primaryDB *gorm.DB + //secondaryDB *gorm.DB + currentDB *gorm.DB } -// 设置一个常量 +// 设置一个全局变量保存数据库连接 var _connect *connect -// 在上一篇文章写过https://blog.csdn.net/bei_FengBoby/article/details/124736603? 查询,直接拿过用 +// 连接 MySQL 数据库 func connectMysql() { - //启用打印日志 + // 启用打印日志 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 + LogLevel: logger.Info, // 日志等级: Silent、Error、Warn、Info Colorful: false, // 禁用彩色打印 }, ) - //换成自己的 - dsn := config.Database.UserName + ":" + config.Database.Password + "@tcp(" + config.Database.Host + ":" + config.Database.Port + ")/" + config.Database.DbName + "?charset=utf8mb4&parseTime=True&loc=Local" - db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ + + // 从配置文件获取主库的 DSN + primary := config.Database.Primary.UserName + ":" + config.Database.Primary.Password + "@tcp(" + config.Database.Primary.Host + ":" + config.Database.Primary.Port + ")/" + config.Database.Primary.DbName + "?charset=utf8mb4&parseTime=True&loc=Local" + + /* // 从配置文件获取从库的 DSN + secondary := config.Database.Secondary.UserName + ":" + config.Database.Secondary.Password + "@tcp(" + config.Database.Secondary.Host + ":" + config.Database.Secondary.Port + ")/" + config.Database.Secondary.DbName + "?charset=utf8mb4&parseTime=True&loc=Local" + */ + // 打开主库连接 + primaryDB, err := gorm.Open(mysql.Open(primary), &gorm.Config{ Logger: newLogger, }) if err != nil { - fmt.Println("数据库连接失败") + log.Printf("主数据库连接失败:", err) return } + /*// 打开从库连接 + secondaryDB, err := gorm.Open(mysql.Open(secondary), &gorm.Config{ + Logger: newLogger, + }) + if err != nil { + log.Println("从数据库连接失败:", err) + return + }*/ + + // 初始化数据库连接结构体,默认使用主数据库 _connect = &connect{ - client: db, + primaryDB: primaryDB, + //secondaryDB: secondaryDB, + currentDB: primaryDB, // 默认连接到主数据库 } +} +// SetPrimary 切换到主库 +func SetPrimary() { + if _connect != nil { + _connect.currentDB = _connect.primaryDB + } } +/*// SetSecondary 切换到从库 +func SetSecondary() { + if _connect != nil { + _connect.currentDB = _connect.secondaryDB + } +}*/ + +/* + 默认使用主库 +db := mysql.MysqlDb() + 进行数据库操作 +var result interface{} +db.First(&result) +fmt.Println(result) + + 切换到从库 +mysql.SetSecondary() +db = mysql.MysqlDb() + 进行数据库操作 +db.First(&result) +fmt.Println(result) + + 切换回主库 +mysql.SetPrimary() +db = mysql.MysqlDb() + 进行数据库操作 +db.First(&result) +fmt.Println(result)*/ + +// MysqlDb 获取当前使用的数据库连接 func MysqlDb() *gorm.DB { if _connect == nil { once.Do(func() { connectMysql() }) } - return _connect.client + return _connect.currentDB } -- Gitee