package mysql import ( "database/sql" "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "gorm.io/plugin/dbresolver" setting "icloudapp.cn/tools/config" "icloudapp.cn/tools/service/entity" "icloudapp.cn/tools/service/model" ) var DBConn *gorm.DB func Init(cfg *setting.MySQLConfig) { dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", cfg.User, cfg.Password, cfg.Host, cfg.DB) sqlDB, err := sql.Open("mysql", dsn) if err != nil { panic(fmt.Sprintf("sql.Open err, \v", err)) } sqlDB.SetMaxOpenConns(cfg.MaxOpenConns) //最大连接数 sqlDB.SetMaxOpenConns(cfg.MaxIdleConns) loggerLevel := logger.Silent if setting.Conf.Mode == "dev" { loggerLevel = logger.Info } gormDB, err := gorm.Open(mysql.New(mysql.Config{ Conn: sqlDB, }), &gorm.Config{ DisableForeignKeyConstraintWhenMigrating: true, //禁用外键生成 Logger: logger.Default.LogMode(loggerLevel), }) if err != nil { panic(fmt.Sprintf("链接数据库失败\v", err)) } // db resolver var material *entity.Material var group *entity.Group var user *entity.User errDbresolver := gormDB.Use(dbresolver.Register(dbresolver.Config{ Sources: []gorm.Dialector{open(cfg)}, Replicas: []gorm.Dialector{open(cfg), open(cfg)}, Policy: dbresolver.RandomPolicy{}, TraceResolverMode: true, }).Register(dbresolver.Config{ Replicas: []gorm.Dialector{open(setting.Conf.ReplicasForUser)}, TraceResolverMode: true, }, user).Register(dbresolver.Config{ Sources: []gorm.Dialector{open(setting.Conf.ReplicasForOrder), open(setting.Conf.ReplicasForOrder)}, Replicas: []gorm.Dialector{open(setting.Conf.ReplicasForOrder)}, TraceResolverMode: true, }, group, material)) if err != nil { panic("dbResolver err :" + errDbresolver.Error()) } DBConn = gormDB model.SetDefault(DBConn) } func open(cfg *setting.MySQLConfig) gorm.Dialector { dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", cfg.User, cfg.Password, cfg.Host, cfg.DB) return mysql.Open(dsn) }