45 lines
886 B
Go
45 lines
886 B
Go
package db
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/mitchellh/go-homedir"
|
|
"gorm.io/driver/mysql"
|
|
"gorm.io/driver/postgres"
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
var Instance *gorm.DB
|
|
|
|
func New(driver, dsn string) (*gorm.DB, error) {
|
|
var dialect gorm.Dialector
|
|
|
|
switch driver {
|
|
case "sqlite":
|
|
file, err := homedir.Expand(dsn)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if err := os.MkdirAll(filepath.Dir(file), os.ModePerm); err != nil {
|
|
return nil, err
|
|
}
|
|
dialect = sqlite.Open(file)
|
|
case "postgres":
|
|
dialect = postgres.Open(dsn)
|
|
case "mysql":
|
|
dialect = mysql.Open(dsn)
|
|
default:
|
|
return nil, fmt.Errorf("invalid database type: %s not in [sqlite, postgres, mysql]", driver)
|
|
}
|
|
|
|
return gorm.Open(dialect, &gorm.Config{})
|
|
}
|
|
|
|
func NewInstance(driver, dsn string) (err error) {
|
|
Instance, err = New(strings.ToLower(driver), dsn)
|
|
return
|
|
}
|