package database import ( "fmt" "os" "gorm.io/driver/mysql" "gorm.io/gorm" ) var ( db *gorm.DB config mysql.Config ) func Init() { config = mysql.Config{ DSN: fmt.Sprintf( "%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local", fallback(os.Getenv("MYSQL_USERNAME"), "root"), fallback(os.Getenv("MYSQL_PASSWORD"), "root"), fallback(os.Getenv("MYSQL_HOST"), "127.0.0.1"), fallback(os.Getenv("MYSQL_PORT"), "3306"), fallback(os.Getenv("MYSQL_DATABASE"), "app"), ), DefaultStringSize: 256, DisableDatetimePrecision: true, DontSupportRenameIndex: true, DontSupportRenameColumn: true, SkipInitializeWithVersion: false, } } func GetDb() *gorm.DB { var err error if db == nil { db, err = gorm.Open(mysql.New(config)) if err != nil { panic(err) } } gdb, err := db.DB() if err != nil { db = nil return GetDb() } if err = gdb.Ping(); err != nil { db = nil return GetDb() } return db } func fallback(value string, fb string) string { if value == "" { return fb } return value }