package global import ( "database/sql/driver" _ "dm" dm "dmgorm2" "eta/eta_index_lib/utils" "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "gorm.io/gorm/schema" "io" "log" "os" "strings" "time" ) type LocalTime time.Time // InitDb // @Description: 数据库初始化 func InitDb() { dbMap := make(map[string]*gorm.DB) //开启日志 logWriter := io.MultiWriter(utils.Binlog) //binlog日志,记录到文件中去 if utils.RunMode == `dev` { // 测试环境,默认输出在控制台,不需要的话,可以注释if里面下面的这行 logWriter = io.MultiWriter(utils.Binlog, os.Stdout) } newLogger := logger.New(log.New(logWriter, "\r\n", log.LstdFlags), logger.Config{ SlowThreshold: 200 * time.Millisecond, //慢sql :200ms LogLevel: logger.Info, //记录的日志类型,info代表所有信息都记录 IgnoreRecordNotFoundError: true, //是否忽略找不到数据错误信息(只是日志记录记录成err还是普通的输出的区别,并不影响业务代码中的:找不到数据行error) Colorful: false, //是否颜色输出 }) // 默认库 // 指标库 connectDb(utils.MYSQL_URL, utils.DbNameIndex, newLogger, dbMap, true) // 手工数据库 connectDb(utils.MYSQL_URL_EDB, utils.DbNameManualIndex, newLogger, dbMap, false) // 钢联库 connectDb(utils.MYSQL_URL_GL, utils.DbNameGL, newLogger, dbMap, false) // master库 connectDb(utils.MYSQL_URL_MASTER, utils.DbNameMaster, newLogger, dbMap, false) //全局赋值数据库链接 DbMap = dbMap } // connectDb // @Description: 达梦数据库连接 // @param dsn // @param aliasName // @param newLogger // @param dbMap // @param isDefault func connectDb(dsn, aliasName string, newLogger logger.Interface, dbMap map[string]*gorm.DB, isDefault bool) { //fmt.Println("dsn:", dsn, " == ;aliasName:", aliasName) if dsn == `` { return } var dialector gorm.Dialector switch utils.DbDriverName { case utils.DbDriverByMysql: if !strings.Contains(dsn, `parseTime`) { dsn += `&parseTime=true` } dialector = mysql.Open(dsn) case utils.DbDriverByDm: dialector = dm.Open(dsn) default: panic(fmt.Errorf("数据库 链接异常,错误的数据库类型,数据库:%s", utils.DbDriverName)) } db, err := gorm.Open(dialector, &gorm.Config{ Logger: newLogger, NamingStrategy: schema.NamingStrategy{ SingularTable: true, // 表示使用单数表名,启用该选项后,GORM 将不会对表名进行复数化处理 }, }) if err != nil { //global.LOG.Errorf("mysql 启动异常,数据库:default;Err:", err) panic(fmt.Errorf("数据库 链接异常,数据库:%s;Err:%s", aliasName, err)) } //创建连接池 sqlDB, err := db.DB() if err != nil { //global.LOG.Errorf("达梦 创建连接池失败,数据库:default;Err:", err) panic(fmt.Errorf("数据库 创建连接池失败,数据库:%s;Err:%s", aliasName, err)) } dbMap[aliasName] = db //默认数据库连接 if isDefault { DEFAULT_DB = db } // SetMaxIdleConns 设置空闲连接池中连接的最大数量 sqlDB.SetMaxIdleConns(50) // SetMaxOpenConns 设置打开数据库连接的最大数量。 sqlDB.SetMaxOpenConns(100) // SetConnMaxLifetime 设置了连接可复用的最大时间。 sqlDB.SetConnMaxLifetime(10 * time.Minute) } func (t *LocalTime) MarshalJSON() ([]byte, error) { tTime := time.Time(*t) if tTime.IsZero() { return []byte("\"\""), nil } return []byte(fmt.Sprintf("\"%v\"", tTime.Format("2006-01-02 15:04:05"))), nil } func (t LocalTime) Value() (driver.Value, error) { var zeroTime time.Time tlt := time.Time(t) //判断给定时间是否和默认零时间的时间戳相同 if tlt.UnixNano() == zeroTime.UnixNano() { return nil, nil } return tlt, nil } func (t *LocalTime) Scan(v interface{}) error { if value, ok := v.(time.Time); ok { *t = LocalTime(value) return nil } return fmt.Errorf("can not convert %v to timestamp", v) }