package database import ( "database/sql" "embed" "sync" "git.ipao.vip/rogeecn/mp-qvyun/conf" "github.com/gofiber/fiber/v3/log" _ "github.com/lib/pq" "github.com/pkg/errors" ) //go:embed migrations/* var MigrationFS embed.FS var ( mutex sync.Mutex db *sql.DB ) func Close() error { if db == nil { return nil } return db.Close() } func GetDB(config conf.Database) (*sql.DB, error) { mutex.Lock() defer mutex.Unlock() if db != nil { return db, nil } once := sync.OnceValues(func() (*sql.DB, error) { log.Debugf("connect postgres with dsn: '%s'", config.DSN()) db, err := sql.Open("postgres", config.DSN()) if err != nil { return nil, errors.Wrap(err, "connect database") } if err := db.Ping(); err != nil { db.Close() return nil, errors.Wrap(err, "ping database") } return db, err }) var err error db, err = once() if err != nil { return nil, err } return db, err }