package orm import ( "SciencesServer/config" "SciencesServer/serve/orm/logic" "fmt" "log" "os" "time" "gorm.io/gorm/logger" "gorm.io/gorm/schema" "gorm.io/gorm" ) var ( orm *gorm.DB engines = map[string]func() logic.IEngine{ "mysql": mysql, "sqlite": sqlite, } ) func mysql() logic.IEngine { return &logic.Mysql{ User: config.SettingInfo.Engine.Mysql.User, Password: config.SettingInfo.Engine.Mysql.Password, Host: config.SettingInfo.Engine.Mysql.Host, Port: config.SettingInfo.Engine.Mysql.Port, DBName: config.SettingInfo.Engine.Mysql.DBName, Parameters: config.SettingInfo.Engine.Mysql.Parameters, } } func sqlite() logic.IEngine { return &logic.Sqlite{Path: config.SettingInfo.Engine.Sqlite.Path, Name: config.SettingInfo.Engine.Sqlite.Name} } func Init() { handle, has := engines[config.SettingInfo.Engine.DBMode] if !has { panic(fmt.Sprintf("Unknown Engine Mode:%d", config.SettingInfo.Engine.DBMode)) } option := &gorm.Config{ DisableForeignKeyConstraintWhenMigrating: true, NamingStrategy: schema.NamingStrategy{ TablePrefix: config.SettingInfo.Engine.TablePrefix, SingularTable: !config.SettingInfo.Engine.Complex, }, } if config.SettingInfo.Engine.Debug { option.Logger = logger.New( log.New(os.Stdout, "\r\n", log.LstdFlags), logger.Config{ SlowThreshold: time.Second, LogLevel: logger.Info, Colorful: false, IgnoreRecordNotFoundError: true, }, ) } db, err := gorm.Open(handle().DSN(), option) if err != nil { panic("Orm Open Error:" + err.Error()) } _db, _ := db.DB() _db.SetMaxIdleConns(config.SettingInfo.Engine.MaxIdleConns) _db.SetMaxOpenConns(config.SettingInfo.Engine.MaxOpenConns) _db.SetConnMaxLifetime(time.Duration(config.SettingInfo.Engine.MaxLifetime) * time.Second) orm = db } func GetDB() *gorm.DB { if _, err := orm.DB(); err != nil { Init() } return orm }