diff --git a/config/app_config.go b/config/app_config.go index d560665a908867b25d8f82bfafffb375663d7d73..adefb1d336f38ff09e47e2778807f8eaa56af82c 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 3050b2ccb26ddd0a51b5655e5eb12b7d3c8e763c..3888c7120602843e000942d46bc7ce209dcc3e6d 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 99ea9df258e8723326c0d08f763b1da5026497f2..b0f0f71f7396425e1da363943f7d46c1c87685ed 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 }