package db import ( "context" "fmt" _ "github.com/go-sql-driver/mysql" "github.com/go-xorm/xorm" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "SSW_WebPlatform/conf" "SSW_WebPlatform/utils" "SSW_WebPlatform/web/middleware/glog" "log" "path/filepath" "sync" "time" ) var ( masterEngine *xorm.Engine Lock sync.Mutex mgoDb *mongo.Client mlock sync.Mutex ) //链接到数据库 func MasterEngine() *xorm.Engine { //判断masterEngine是否存在 if masterEngine != nil { return masterEngine } //创建之前会涉及并发,所以要加锁 Lock.Lock() defer Lock.Unlock() //细节,防止多个请求锁住 if masterEngine != nil { return masterEngine } c := conf.MasterDbConfig driveSource := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8", c.User, c.Pwd, c.Host, c.Port, c.DbName) engine, err := xorm.NewEngine(conf.DriverName, driveSource) //开启sql,debug //engine.ShowSQL(true) if err != nil { log.Fatal("dbhelper.DbinstanceMaster error= ", err) return nil } else { masterEngine = engine return masterEngine } return masterEngine } //创建mongoDb数据库链接 func MgoDb() *mongo.Client { //判断mgoDb是否存在 if mgoDb != nil { return mgoDb } //创建之前会涉及并发,所以要加锁 mlock.Lock() defer mlock.Unlock() //细节,防止多个请求锁住 if mgoDb != nil { return mgoDb } //1.建立链接 ctx, _ := context.WithTimeout(context.Background(), 10*time.Second) client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017")) if err != nil { log.Fatal("dbhelper.MgoDb error= ", err) return nil } else { mgoDb = client return mgoDb } } //数据备份 func BackUp() { var ( engine *xorm.Engine err error ) c := conf.MasterDbConfig driveSource := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8", c.User, c.Pwd, c.Host, c.Port, c.DbName) if engine, err = xorm.NewEngine(conf.DriverName, driveSource); err != nil { return } if err = engine.Ping(); err != nil { glog.ErrorExtln("数据库连接失败:", "err:", err.Error()) return } else { glog.ErrorExtln("数据库连接成功:", "driveSource", driveSource) } filename := utils.TimeFormat(time.Now(),"yyyy-MM-dd") + ".sql" dirpath := filepath.Join(c.BackUp,filename) err = engine.DumpAllToFile(dirpath, conf.DriverName) if err != nil { return } }