// Package define ... // // Description : define ... // // Author : go_developer@163.com<白茶清欢> // // Date : 2024-08-20 17:36 package database import ( "context" "fmt" "git.zhangdeman.cn/zhangdeman/consts" "git.zhangdeman.cn/zhangdeman/database/define" "git.zhangdeman.cn/zhangdeman/logger/wrapper" "go.uber.org/zap" "gorm.io/driver/mysql" "gorm.io/driver/sqlite" "gorm.io/gorm" gormLogger "gorm.io/gorm/logger" ) // DBClient 包装日志实例 // // Author : go_developer@163.com<白茶清欢> // // Date : 3:09 PM 2021/12/24 type DBClient struct { DbFlag string // 数据库标识 LoggerInstance *zap.Logger // 日志实例 master *gorm.DB // 主库 slave *gorm.DB // 从库 ExtraFieldList []string // 提取的字段 Cfg define.Driver // 数据库配置 } // Init 初始化客户端 // // Author : go_developer@163.com<白茶清欢> // // Date : 17:44 2024/8/20 func (dc *DBClient) Init(databaseConfig *define.Database) error { var err error if dc.master, err = dc.GetDatabaseClient(databaseConfig.Master, dc.LoggerInstance); nil != err { return err } if dc.slave, err = dc.GetDatabaseClient(databaseConfig.Slave, dc.LoggerInstance); nil != err { return err } return nil } // GetMaster 获取主库连接 // // Author : go_developer@163.com<白茶清欢> // // Date : 3:28 PM 2021/12/24 func (dc *DBClient) GetMaster(ctx context.Context) *gorm.DB { session := dc.master.Session(&gorm.Session{}) session.Logger = dc.getLogger(ctx, session, "master") return session } // GetSlave 获取从库链接 // // Author : go_developer@163.com<白茶清欢> // // Date : 3:29 PM 2021/12/24 func (dc *DBClient) GetSlave(ctx context.Context) *gorm.DB { session := dc.slave.Session(&gorm.Session{}) session.Logger = dc.getLogger(ctx, session, "slave") return session } // getLogger 获取日志实例 // // Author : go_developer@163.com<白茶清欢> // // Date : 3:45 PM 2021/12/24 func (dc *DBClient) getLogger(ctx context.Context, dbClient *gorm.DB, node string) gormLogger.Interface { return wrapper.NewGormLoggerWithInstance(ctx, dbClient, dc.LoggerInstance, dc.DbFlag+"|"+node, dc.ExtraFieldList) } // GetDatabaseClient 获取数据库连接 // // Author : go_developer@163.com<白茶清欢> // // Date : 18:41 2022/6/11 func (dc *DBClient) GetDatabaseClient(conf *define.Driver, logInstance *zap.Logger) (*gorm.DB, error) { var ( instance *gorm.DB err error ) if nil == logInstance { logInstance = dc.LoggerInstance } if conf.DBType == consts.DatabaseDriverMysql { if instance, err = gorm.Open(mysql.Open(dc.buildConnectionDSN(conf)), &gorm.Config{}); nil != err { return nil, err } } else if conf.DBType == consts.DatabaseDriverSqlite3 { if instance, err = gorm.Open(sqlite.Open(dc.buildConnectionDSN(conf)), &gorm.Config{}); nil != err { return nil, err } } else { return nil, fmt.Errorf("%v : db driver is not support", conf.DBType) } instance.Logger = wrapper.NewGormLoggerWithInstance(nil, instance, logInstance, "", nil) return instance, nil } // buildConnectionDSN 构建连接信息 // // Author : go_developer@163.com<白茶清欢> // // Date : 18:42 2022/6/11 func (dc *DBClient) buildConnectionDSN(conf *define.Driver) string { if conf.DBType == consts.DatabaseDriverSqlite3 { // 兼容sqlite3 return conf.Host } return fmt.Sprintf( "%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True&loc=%s", conf.Username, conf.Password, conf.Host, conf.Port, conf.Database, conf.Charset, conf.Timezone, ) }