package internal import ( "database/sql" "fmt" "github.com/uptrace/bun/extra/bundebug" "log" "os" "sync" _ "github.com/go-sql-driver/mysql" "github.com/uptrace/bun" "github.com/uptrace/bun/dialect/mysqldialect" ) type database struct { instance *bun.DB } type Database interface { GetInstance() *bun.DB } var ( instance *database = nil once sync.Once ) func initialize() { db, err := sql.Open("mysql", fmt.Sprintf( "%s:%s@tcp(%s)/%s", os.Getenv("MYSQL_USER"), os.Getenv("MYSQL_PASSWORD"), os.Getenv("MYSQL_HOST"), os.Getenv("MYSQL_DATABASE"))) if err != nil { panic(err) } // Resolve instances of bun ormDb := bun.NewDB(db, mysqldialect.New()) ormDb.AddQueryHook(bundebug.NewQueryHook()) // Check Connection conErr := ormDb.Ping() if conErr != nil { panic(conErr) } log.Println("Connection to db succeded") instance = &database{instance: ormDb} } func InitDatabase() Database { if instance == nil { once.Do(initialize) } return instance } func (d *database) GetInstance() *bun.DB { return d.instance }